DXRenderDevice.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. #pragma once
  2. #ifdef BF_MINGW
  3. #define D3D11_APPEND_ALIGNED_ELEMENT ( 0xffffffff )
  4. #ifndef __C89_NAMELESS
  5. #define __C89_NAMELESS
  6. #define __C89_NAMELESSUNIONNAME
  7. #endif
  8. #pragma clang diagnostic ignored "-Wunknown-pragmas"
  9. #pragma clang diagnostic ignored "-Wunknown-attributes"
  10. #pragma clang diagnostic ignored "-Wunused-member-function"
  11. #pragma clang diagnostic ignored "-Wunused-conversion-function"
  12. #define __in
  13. #define __in_opt
  14. #define __in_ecount(a)
  15. #define __in_ecount_opt(a)
  16. #define __in_bcount(a)
  17. #define __in_bcount_opt(a)
  18. #define __inout
  19. #define __inout_opt
  20. #define __out
  21. #define __out_opt
  22. #define __out_bcount(a)
  23. #define __out_bcount_opt(a)
  24. #define __out_ecount(a)
  25. #define __out_ecount_opt(a)
  26. #define __out_ecount_part_opt(a, b)
  27. #endif
  28. #pragma warning (push)
  29. #pragma warning (disable:4005)
  30. #include <d3d11.h>
  31. #pragma warning (pop)
  32. #ifdef BF_MINGW
  33. #undef __in
  34. #undef __out
  35. #endif
  36. #include "Common.h"
  37. #include "gfx/Shader.h"
  38. #include "gfx/Texture.h"
  39. #include "gfx/RenderDevice.h"
  40. #include "gfx/DrawLayer.h"
  41. #include "gfx/ModelInstance.h"
  42. #include "util/HashSet.h"
  43. #include "util/Dictionary.h"
  44. #include <map>
  45. NS_BF_BEGIN;
  46. class WinBFWindow;
  47. class BFApp;
  48. class DXRenderDevice;
  49. class DXTexture : public Texture
  50. {
  51. public:
  52. String mPath;
  53. DXRenderDevice* mRenderDevice;
  54. ID3D11Texture2D* mD3DTexture;
  55. ID3D11ShaderResourceView* mD3DResourceView;
  56. ID3D11RenderTargetView* mD3DRenderTargetView;
  57. ID3D11Texture2D* mD3DDepthBuffer;
  58. ID3D11DepthStencilView* mD3DDepthStencilView;
  59. uint32* mContentBits;
  60. public:
  61. DXTexture();
  62. ~DXTexture();
  63. void ReleaseNative();
  64. void ReinitNative();
  65. virtual void PhysSetAsTarget() override;
  66. virtual void Blt(ImageData* imageData, int x, int y) override;
  67. virtual void SetBits(int destX, int destY, int destWidth, int destHeight, int srcPitch, uint32* bits) override;
  68. virtual void GetBits(int srcX, int srcY, int srcWidth, int srcHeight, int destPitch, uint32* bits) override;
  69. };
  70. class DXShaderParam : public ShaderParam
  71. {
  72. public:
  73. ID3D10EffectVariable* mD3DVariable;
  74. public:
  75. DXShaderParam();
  76. ~DXShaderParam();
  77. virtual void SetTexture(Texture* texture);
  78. virtual void SetFloat4(float x, float y, float z, float w) override;
  79. };
  80. typedef std::map<String, DXShaderParam*> DXShaderParamMap;
  81. class DXShader : public Shader
  82. {
  83. public:
  84. DXRenderDevice* mRenderDevice;
  85. String mSrcPath;
  86. VertexDefinition* mVertexDef;
  87. ID3D11InputLayout* mD3DLayout;
  88. ID3D11VertexShader* mD3DVertexShader;
  89. ID3D11PixelShader* mD3DPixelShader;
  90. DXShaderParamMap mParamsMap;
  91. ID3D11Buffer* mConstBuffer;
  92. bool mHas2DPosition;
  93. public:
  94. DXShader();
  95. ~DXShader();
  96. void ReleaseNative();
  97. void ReinitNative();
  98. bool Load();
  99. virtual ShaderParam* GetShaderParam(const StringImpl& name) override;
  100. };
  101. class DXDrawBatch : public DrawBatch
  102. {
  103. public:
  104. public:
  105. DXDrawBatch();
  106. ~DXDrawBatch();
  107. virtual void Render(RenderDevice* renderDevice, RenderWindow* renderWindow) override;
  108. };
  109. class DXDrawLayer : public DrawLayer
  110. {
  111. public:
  112. virtual DrawBatch* CreateDrawBatch();
  113. virtual RenderCmd* CreateSetTextureCmd(int textureIdx, Texture* texture) override;
  114. virtual void SetShaderConstantData(int usageIdx, int slotIdx, void* constData, int size) override;
  115. virtual void SetShaderConstantDataTyped(int usageIdx, int slotIdx, void* constData, int size, int* typeData, int typeCount) override;
  116. public:
  117. DXDrawLayer();
  118. ~DXDrawLayer();
  119. };
  120. class DXRenderWindow : public RenderWindow
  121. {
  122. public:
  123. HWND mHWnd;
  124. DXRenderDevice* mDXRenderDevice;
  125. IDXGISwapChain* mDXSwapChain;
  126. ID3D11Texture2D* mD3DBackBuffer;
  127. ID3D11RenderTargetView* mD3DRenderTargetView;
  128. ID3D11Texture2D* mD3DDepthBuffer;
  129. ID3D11DepthStencilView* mD3DDepthStencilView;
  130. HANDLE mFrameWaitObject;
  131. float mRefreshRate;
  132. bool mResizePending;
  133. bool mWindowed;
  134. int mPendingWidth;
  135. int mPendingHeight;
  136. public:
  137. virtual void PhysSetAsTarget();
  138. void CheckDXResult(HRESULT result);
  139. public:
  140. DXRenderWindow(DXRenderDevice* renderDevice, WinBFWindow* window, bool windowed);
  141. ~DXRenderWindow();
  142. void ReleaseNative();
  143. void ReinitNative();
  144. void SetAsTarget() override;
  145. void Resized() override;
  146. virtual void Present() override;
  147. void CopyBitsTo(uint32* dest, int width, int height);
  148. virtual float GetRefreshRate() override;
  149. virtual bool WaitForVBlank() override;
  150. };
  151. typedef std::vector<DXDrawBatch*> DXDrawBatchVector;
  152. #define DX_VTXBUFFER_SIZE 1024*1024
  153. #define DX_IDXBUFFER_SIZE 64*1024
  154. class DXDrawBufferPool
  155. {
  156. public:
  157. std::vector<void*> mPooledIndexBuffers;
  158. int mIdxPoolIdx;
  159. std::vector<void*> mPooledVertexBuffers;
  160. int mVtxPoolIdx;
  161. void* mIndexBuffer;
  162. void* mVertexBuffer;
  163. int mIdxByteIdx;
  164. int mVtxByteIdx;
  165. void AllocateIndices(int minIndices);
  166. void AllocVertices(int minVertices);
  167. };
  168. class DXRenderState : public RenderState
  169. {
  170. public:
  171. ID3D11RasterizerState* mD3DRasterizerState;
  172. ID3D11DepthStencilState* mD3DDepthStencilState;
  173. public:
  174. DXRenderState();
  175. ~DXRenderState();
  176. void ReleaseNative();
  177. void ReinitNative();
  178. void InvalidateRasterizerState();
  179. void IndalidateDepthStencilState();
  180. virtual void SetClipped(bool clipped);
  181. virtual void SetTexWrap(bool clipped);
  182. virtual void SetClipRect(const RectF& rect);
  183. virtual void SetWriteDepthBuffer(bool writeDepthBuffer);
  184. virtual void SetDepthFunc(DepthFunc depthFunc);
  185. };
  186. class DXModelPrimitives
  187. {
  188. public:
  189. String mMaterialName;
  190. int mNumIndices;
  191. int mNumVertices;
  192. Array<DXTexture*> mTextures;
  193. ID3D11Buffer* mD3DIndexBuffer;
  194. //TODO: Split the vertex buffer up into static and dynamic buffers
  195. ID3D11Buffer* mD3DVertexBuffer;
  196. public:
  197. DXModelPrimitives();
  198. ~DXModelPrimitives();
  199. };
  200. class DXModelMesh
  201. {
  202. public:
  203. Array<DXModelPrimitives> mPrimitives;
  204. };
  205. class DXModelInstance : public ModelInstance
  206. {
  207. public:
  208. DXRenderDevice* mD3DRenderDevice;
  209. Array<DXModelMesh> mDXModelMeshs;
  210. public:
  211. DXModelInstance(ModelDef* modelDef);
  212. ~DXModelInstance();
  213. virtual void CommandQueued(DrawLayer* drawLayer) override;
  214. virtual void Render(RenderDevice* renderDevice, RenderWindow* renderWindow) override;
  215. };
  216. class DXVertexDefinition : public VertexDefinition
  217. {
  218. public:
  219. ~DXVertexDefinition();
  220. };
  221. class DXSetTextureCmd : public RenderCmd
  222. {
  223. public:
  224. int mTextureIdx;
  225. Texture* mTexture;
  226. public:
  227. virtual void Render(RenderDevice* renderDevice, RenderWindow* renderWindow) override;
  228. };
  229. class DXSetConstantData : public RenderCmd
  230. {
  231. public:
  232. int mUsageIdx; // 0 = VS, 1 = PS
  233. int mSlotIdx;
  234. int mSize;
  235. uint8 mData[1];
  236. public:
  237. virtual void Render(RenderDevice* renderDevice, RenderWindow* renderWindow) override;
  238. };
  239. class DXRenderDevice : public RenderDevice
  240. {
  241. public:
  242. IDXGIFactory* mDXGIFactory;
  243. ID3D11Device* mD3DDevice;
  244. ID3D11DeviceContext* mD3DDeviceContext;
  245. ID3D11BlendState* mD3DNormalBlendState;
  246. ID3D11SamplerState* mD3DDefaultSamplerState;
  247. ID3D11SamplerState* mD3DWrapSamplerState;
  248. bool mNeedsReinitNative;
  249. ID3D11Buffer* mMatrix2DBuffer;
  250. ID3D11Buffer* mD3DVertexBuffer;
  251. ID3D11Buffer* mD3DIndexBuffer;
  252. int mVtxByteIdx;
  253. int mIdxByteIdx;
  254. HashSet<DXRenderState*> mRenderStates;
  255. HashSet<DXTexture*> mTextures;
  256. HashSet<DXShader*> mShaders;
  257. Dictionary<String, DXTexture*> mTextureMap;
  258. Dictionary<int, ID3D11Buffer*> mBufferMap;
  259. public:
  260. virtual void PhysSetRenderState(RenderState* renderState) override;
  261. virtual void PhysSetRenderWindow(RenderWindow* renderWindow);
  262. virtual void PhysSetRenderTarget(Texture* renderTarget) override;
  263. virtual RenderState* CreateRenderState(RenderState* srcRenderState) override;
  264. virtual ModelInstance* CreateModelInstance(ModelDef* modelDef, ModelCreateFlags flags) override;
  265. public:
  266. DXRenderDevice();
  267. virtual ~DXRenderDevice();
  268. bool Init(BFApp* app) override;
  269. void ReleaseNative();
  270. void ReinitNative();
  271. void FrameStart() override;
  272. void FrameEnd() override;
  273. Texture* LoadTexture(const StringImpl& fileName, int flags) override;
  274. Texture* LoadTexture(ImageData* imageData, int flags) override;
  275. Texture* CreateDynTexture(int width, int height) override;
  276. Shader* LoadShader(const StringImpl& fileName, VertexDefinition* vertexDefinition) override;
  277. Texture* CreateRenderTarget(int width, int height, bool destAlpha) override;
  278. void SetRenderState(RenderState* renderState) override;
  279. };
  280. NS_BF_END;