DXRenderDevice.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  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. ImageData* mImageData;
  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. ID3D11InputLayout* mD3DLayout;
  85. ID3D11VertexShader* mD3DVertexShader;
  86. ID3D11PixelShader* mD3DPixelShader;
  87. DXShaderParamMap mParamsMap;
  88. ID3D11Buffer* mConstBuffer;
  89. bool mHas2DPosition;
  90. public:
  91. DXShader();
  92. ~DXShader();
  93. virtual ShaderParam* GetShaderParam(const StringImpl& name) override;
  94. };
  95. class DXDrawBatch : public DrawBatch
  96. {
  97. public:
  98. public:
  99. DXDrawBatch();
  100. ~DXDrawBatch();
  101. virtual void Render(RenderDevice* renderDevice, RenderWindow* renderWindow) override;
  102. };
  103. class DXDrawLayer : public DrawLayer
  104. {
  105. public:
  106. virtual DrawBatch* CreateDrawBatch();
  107. virtual RenderCmd* CreateSetTextureCmd(int textureIdx, Texture* texture) override;
  108. virtual void SetShaderConstantData(int usageIdx, int slotIdx, void* constData, int size) override;
  109. virtual void SetShaderConstantDataTyped(int usageIdx, int slotIdx, void* constData, int size, int* typeData, int typeCount) override;
  110. public:
  111. DXDrawLayer();
  112. ~DXDrawLayer();
  113. };
  114. class DXRenderWindow : public RenderWindow
  115. {
  116. public:
  117. HWND mHWnd;
  118. DXRenderDevice* mDXRenderDevice;
  119. IDXGISwapChain* mDXSwapChain;
  120. ID3D11Texture2D* mD3DBackBuffer;
  121. ID3D11RenderTargetView* mD3DRenderTargetView;
  122. ID3D11Texture2D* mD3DDepthBuffer;
  123. ID3D11DepthStencilView* mD3DDepthStencilView;
  124. bool mResizePending;
  125. bool mWindowed;
  126. int mPendingWidth;
  127. int mPendingHeight;
  128. public:
  129. virtual void PhysSetAsTarget();
  130. public:
  131. DXRenderWindow(DXRenderDevice* renderDevice, WinBFWindow* window, bool windowed);
  132. ~DXRenderWindow();
  133. void ReleaseNative();
  134. void ReinitNative();
  135. void SetAsTarget() override;
  136. void Resized() override;
  137. virtual void Present() override;
  138. void CopyBitsTo(uint32* dest, int width, int height);
  139. };
  140. typedef std::vector<DXDrawBatch*> DXDrawBatchVector;
  141. #define DX_VTXBUFFER_SIZE 1024*1024
  142. #define DX_IDXBUFFER_SIZE 64*1024
  143. class DXDrawBufferPool
  144. {
  145. public:
  146. std::vector<void*> mPooledIndexBuffers;
  147. int mIdxPoolIdx;
  148. std::vector<void*> mPooledVertexBuffers;
  149. int mVtxPoolIdx;
  150. void* mIndexBuffer;
  151. void* mVertexBuffer;
  152. int mIdxByteIdx;
  153. int mVtxByteIdx;
  154. void AllocateIndices(int minIndices);
  155. void AllocVertices(int minVertices);
  156. };
  157. class DXRenderState : public RenderState
  158. {
  159. public:
  160. ID3D11RasterizerState* mD3DRasterizerState;
  161. ID3D11DepthStencilState* mD3DDepthStencilState;
  162. public:
  163. DXRenderState();
  164. ~DXRenderState();
  165. void ReleaseNative();
  166. void ReinitNative();
  167. void InvalidateRasterizerState();
  168. void IndalidateDepthStencilState();
  169. virtual void SetClipped(bool clipped);
  170. virtual void SetTexWrap(bool clipped);
  171. virtual void SetClipRect(const Rect& rect);
  172. virtual void SetWriteDepthBuffer(bool writeDepthBuffer);
  173. virtual void SetDepthFunc(DepthFunc depthFunc);
  174. };
  175. class DXModelPrimitives
  176. {
  177. public:
  178. String mMaterialName;
  179. int mNumIndices;
  180. int mNumVertices;
  181. Array<DXTexture*> mTextures;
  182. ID3D11Buffer* mD3DIndexBuffer;
  183. //TODO: Split the vertex buffer up into static and dynamic buffers
  184. ID3D11Buffer* mD3DVertexBuffer;
  185. public:
  186. DXModelPrimitives();
  187. ~DXModelPrimitives();
  188. };
  189. class DXModelMesh
  190. {
  191. public:
  192. Array<DXModelPrimitives> mPrimitives;
  193. };
  194. class DXModelInstance : public ModelInstance
  195. {
  196. public:
  197. DXRenderDevice* mD3DRenderDevice;
  198. Array<DXModelMesh> mDXModelMeshs;
  199. public:
  200. DXModelInstance(ModelDef* modelDef);
  201. ~DXModelInstance();
  202. virtual void CommandQueued(DrawLayer* drawLayer) override;
  203. virtual void Render(RenderDevice* renderDevice, RenderWindow* renderWindow) override;
  204. };
  205. class DXVertexDefinition : public VertexDefinition
  206. {
  207. public:
  208. ~DXVertexDefinition();
  209. };
  210. class DXSetTextureCmd : public RenderCmd
  211. {
  212. public:
  213. int mTextureIdx;
  214. Texture* mTexture;
  215. public:
  216. virtual void Render(RenderDevice* renderDevice, RenderWindow* renderWindow) override;
  217. };
  218. class DXSetConstantData : public RenderCmd
  219. {
  220. public:
  221. int mUsageIdx; // 0 = VS, 1 = PS
  222. int mSlotIdx;
  223. int mSize;
  224. uint8 mData[1];
  225. public:
  226. virtual void Render(RenderDevice* renderDevice, RenderWindow* renderWindow) override;
  227. };
  228. class DXRenderDevice : public RenderDevice
  229. {
  230. public:
  231. IDXGIFactory* mDXGIFactory;
  232. ID3D11Device* mD3DDevice;
  233. ID3D11DeviceContext* mD3DDeviceContext;
  234. ID3D11BlendState* mD3DNormalBlendState;
  235. ID3D11SamplerState* mD3DDefaultSamplerState;
  236. ID3D11SamplerState* mD3DWrapSamplerState;
  237. bool mHasVSync;
  238. ID3D11Buffer* mD3DVertexBuffer;
  239. ID3D11Buffer* mD3DIndexBuffer;
  240. int mVtxByteIdx;
  241. int mIdxByteIdx;
  242. HashSet<DXRenderState*> mRenderStates;
  243. HashSet<DXTexture*> mTextures;
  244. Dictionary<String, DXTexture*> mTextureMap;
  245. Dictionary<int, ID3D11Buffer*> mBufferMap;
  246. public:
  247. virtual void PhysSetRenderState(RenderState* renderState) override;
  248. virtual void PhysSetRenderWindow(RenderWindow* renderWindow);
  249. virtual void PhysSetRenderTarget(Texture* renderTarget) override;
  250. virtual RenderState* CreateRenderState(RenderState* srcRenderState) override;
  251. virtual ModelInstance* CreateModelInstance(ModelDef* modelDef) override;
  252. public:
  253. DXRenderDevice();
  254. virtual ~DXRenderDevice();
  255. bool Init(BFApp* app) override;
  256. void ReleaseNative();
  257. void ReinitNative();
  258. void FrameStart() override;
  259. void FrameEnd() override;
  260. Texture* LoadTexture(const StringImpl& fileName, int flags) override;
  261. Texture* LoadTexture(ImageData* imageData, int flags) override;
  262. Texture* CreateDynTexture(int width, int height) override;
  263. Shader* LoadShader(const StringImpl& fileName, VertexDefinition* vertexDefinition) override;
  264. Texture* CreateRenderTarget(int width, int height, bool destAlpha) override;
  265. void SetRenderState(RenderState* renderState) override;
  266. };
  267. NS_BF_END;