• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // Renderer11.h: Defines a back-end specific class for the D3D11 renderer.
8 
9 #ifndef LIBGLESV2_RENDERER_RENDERER11_H_
10 #define LIBGLESV2_RENDERER_RENDERER11_H_
11 
12 #include "common/angleutils.h"
13 #include "libGLESv2/angletypes.h"
14 #include "libGLESv2/mathutil.h"
15 
16 #include "libGLESv2/renderer/Renderer.h"
17 #include "libGLESv2/renderer/RenderStateCache.h"
18 #include "libGLESv2/renderer/InputLayoutCache.h"
19 #include "libGLESv2/renderer/RenderTarget.h"
20 
21 namespace gl
22 {
23 class Renderbuffer;
24 }
25 
26 namespace rx
27 {
28 
29 class VertexDataManager;
30 class IndexDataManager;
31 class StreamingIndexBufferInterface;
32 
33 enum
34 {
35     MAX_VERTEX_UNIFORM_VECTORS_D3D11 = 1024,
36     MAX_FRAGMENT_UNIFORM_VECTORS_D3D11 = 1024
37 };
38 
39 class Renderer11 : public Renderer
40 {
41   public:
42     Renderer11(egl::Display *display, HDC hDc);
43     virtual ~Renderer11();
44 
45     static Renderer11 *makeRenderer11(Renderer *renderer);
46 
47     virtual EGLint initialize();
48     virtual bool resetDevice();
49 
50     virtual int generateConfigs(ConfigDesc **configDescList);
51     virtual void deleteConfigs(ConfigDesc *configDescList);
52 
53     virtual void sync(bool block);
54 
55     virtual SwapChain *createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
56 
57     virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler);
58     virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture);
59 
60     virtual void setRasterizerState(const gl::RasterizerState &rasterState);
61     virtual void setBlendState(const gl::BlendState &blendState, const gl::Color &blendColor,
62                                unsigned int sampleMask);
63     virtual void setDepthStencilState(const gl::DepthStencilState &depthStencilState, int stencilRef,
64                                       int stencilBackRef, bool frontFaceCCW);
65 
66     virtual void setScissorRectangle(const gl::Rectangle &scissor, bool enabled);
67     virtual bool setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace,
68                              bool ignoreViewport);
69 
70     virtual bool applyPrimitiveType(GLenum mode, GLsizei count);
71     virtual bool applyRenderTarget(gl::Framebuffer *frameBuffer);
72     virtual void applyShaders(gl::ProgramBinary *programBinary);
73     virtual void applyUniforms(gl::ProgramBinary *programBinary, gl::UniformArray *uniformArray);
74     virtual GLenum applyVertexBuffer(gl::ProgramBinary *programBinary, gl::VertexAttribute vertexAttributes[], GLint first, GLsizei count, GLsizei instances);
75     virtual GLenum applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
76 
77     virtual void drawArrays(GLenum mode, GLsizei count, GLsizei instances);
78     virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances);
79 
80     virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer);
81 
82     virtual void markAllStateDirty();
83 
84     // lost device
85     void notifyDeviceLost();
86     virtual bool isDeviceLost();
87     virtual bool testDeviceLost(bool notify);
88     virtual bool testDeviceResettable();
89 
90     // Renderer capabilities
91     virtual DWORD getAdapterVendor() const;
92     virtual std::string getRendererDescription() const;
93     virtual GUID getAdapterIdentifier() const;
94 
95     virtual bool getBGRATextureSupport() const;
96     virtual bool getDXT1TextureSupport();
97     virtual bool getDXT3TextureSupport();
98     virtual bool getDXT5TextureSupport();
99     virtual bool getEventQuerySupport();
100     virtual bool getFloat32TextureSupport(bool *filtering, bool *renderable);
101     virtual bool getFloat16TextureSupport(bool *filtering, bool *renderable);
102     virtual bool getLuminanceTextureSupport();
103     virtual bool getLuminanceAlphaTextureSupport();
104     virtual unsigned int getMaxVertexTextureImageUnits() const;
105     virtual unsigned int getMaxCombinedTextureImageUnits() const;
106     virtual unsigned int getReservedVertexUniformVectors() const;
107     virtual unsigned int getReservedFragmentUniformVectors() const;
108     virtual unsigned int getMaxVertexUniformVectors() const;
109     virtual unsigned int getMaxFragmentUniformVectors() const;
110     virtual unsigned int getMaxVaryingVectors() const;
111     virtual bool getNonPower2TextureSupport() const;
112     virtual bool getDepthTextureSupport() const;
113     virtual bool getOcclusionQuerySupport() const;
114     virtual bool getInstancingSupport() const;
115     virtual bool getTextureFilterAnisotropySupport() const;
116     virtual float getTextureMaxAnisotropy() const;
117     virtual bool getShareHandleSupport() const;
118     virtual bool getDerivativeInstructionSupport() const;
119     virtual bool getPostSubBufferSupport() const;
120 
121     virtual int getMajorShaderModel() const;
122     virtual float getMaxPointSize() const;
123     virtual int getMaxViewportDimension() const;
124     virtual int getMaxTextureWidth() const;
125     virtual int getMaxTextureHeight() const;
126     virtual bool get32BitIndexSupport() const;
127     virtual int getMinSwapInterval() const;
128     virtual int getMaxSwapInterval() const;
129 
130     virtual GLsizei getMaxSupportedSamples() const;
131     int getNearestSupportedSamples(DXGI_FORMAT format, unsigned int requested) const;
132 
133     virtual unsigned int getMaxRenderTargets() const;
134 
135     // Pixel operations
136     virtual bool copyToRenderTarget(TextureStorageInterface2D *dest, TextureStorageInterface2D *source);
137     virtual bool copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureStorageInterfaceCube *source);
138 
139     virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
140                            GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level);
141     virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
142                            GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level);
143 
144     bool copyTexture(ID3D11ShaderResourceView *source, const gl::Rectangle &sourceArea, unsigned int sourceWidth, unsigned int sourceHeight,
145                      ID3D11RenderTargetView *dest, const gl::Rectangle &destArea, unsigned int destWidth, unsigned int destHeight, GLenum destFormat);
146 
147     virtual bool blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, const gl::Rectangle &drawRect,
148                           bool blitRenderTarget, bool blitDepthStencil);
149     virtual void readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
150                             GLsizei outputPitch, bool packReverseRowOrder, GLint packAlignment, void* pixels);
151 
152     // RenderTarget creation
153     virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth);
154     virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth);
155 
156     // Shader operations
157     virtual ShaderExecutable *loadExecutable(const void *function, size_t length, rx::ShaderType type);
158     virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, rx::ShaderType type, D3DWorkaroundType workaround);
159 
160     // Image operations
161     virtual Image *createImage();
162     virtual void generateMipmap(Image *dest, Image *source);
163     virtual TextureStorage *createTextureStorage2D(SwapChain *swapChain);
164     virtual TextureStorage *createTextureStorage2D(int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height);
165     virtual TextureStorage *createTextureStorageCube(int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size);
166 
167     // Buffer creation
168     virtual VertexBuffer *createVertexBuffer();
169     virtual IndexBuffer *createIndexBuffer();
170     virtual BufferStorage *createBufferStorage();
171 
172     // Query and Fence creation
173     virtual QueryImpl *createQuery(GLenum type);
174     virtual FenceImpl *createFence();
175 
176     // D3D11-renderer specific methods
getDevice()177     ID3D11Device *getDevice() { return mDevice; }
getDeviceContext()178     ID3D11DeviceContext *getDeviceContext() { return mDeviceContext; };
getDxgiFactory()179     IDXGIFactory *getDxgiFactory() { return mDxgiFactory; };
180 
181     bool getRenderTargetResource(gl::Renderbuffer *colorbuffer, unsigned int *subresourceIndex, ID3D11Texture2D **resource);
182     void unapplyRenderTargets();
183     void setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView);
184 
185     virtual bool getLUID(LUID *adapterLuid) const;
186 
187   private:
188     DISALLOW_COPY_AND_ASSIGN(Renderer11);
189 
190     void drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
191     void drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer, int instances);
192 
193     void readTextureData(ID3D11Texture2D *texture, unsigned int subResource, const gl::Rectangle &area,
194                          GLenum format, GLenum type, GLsizei outputPitch, bool packReverseRowOrder,
195                          GLint packAlignment, void *pixels);
196 
197     void maskedClear(const gl::ClearParameters &clearParams, bool usingExtendedDrawBuffers);
198     rx::Range getViewportBounds() const;
199 
200     bool blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget,
201                               RenderTarget *drawRenderTarget, bool wholeBufferCopy);
202     ID3D11Texture2D *resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource);
203 
204     HMODULE mD3d11Module;
205     HMODULE mDxgiModule;
206     HDC mDc;
207 
208     bool mDeviceLost;
209 
210     void initializeDevice();
211     void releaseDeviceResources();
212     int getMinorShaderModel() const;
213     void release();
214 
215     RenderStateCache mStateCache;
216 
217     // Support flags
218     bool mFloat16TextureSupport;
219     bool mFloat16FilterSupport;
220     bool mFloat16RenderSupport;
221 
222     bool mFloat32TextureSupport;
223     bool mFloat32FilterSupport;
224     bool mFloat32RenderSupport;
225 
226     bool mDXT1TextureSupport;
227     bool mDXT3TextureSupport;
228     bool mDXT5TextureSupport;
229 
230     bool mDepthTextureSupport;
231 
232     // Multisample format support
233     struct MultisampleSupportInfo
234     {
235         unsigned int qualityLevels[D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT];
236     };
237 
238     typedef std::unordered_map<DXGI_FORMAT, MultisampleSupportInfo, std::hash<int> > MultisampleSupportMap;
239     MultisampleSupportMap mMultisampleSupportMap;
240 
241     unsigned int mMaxSupportedSamples;
242 
243     // current render target states
244     unsigned int mAppliedRenderTargetSerials[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS];
245     unsigned int mAppliedDepthbufferSerial;
246     unsigned int mAppliedStencilbufferSerial;
247     bool mDepthStencilInitialized;
248     bool mRenderTargetDescInitialized;
249     rx::RenderTarget::Desc mRenderTargetDesc;
250     unsigned int mCurDepthSize;
251     unsigned int mCurStencilSize;
252 
253     // Currently applied sampler states
254     bool mForceSetVertexSamplerStates[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
255     gl::SamplerState mCurVertexSamplerStates[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
256 
257     bool mForceSetPixelSamplerStates[gl::MAX_TEXTURE_IMAGE_UNITS];
258     gl::SamplerState mCurPixelSamplerStates[gl::MAX_TEXTURE_IMAGE_UNITS];
259 
260     // Currently applied textures
261     unsigned int mCurVertexTextureSerials[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
262     unsigned int mCurPixelTextureSerials[gl::MAX_TEXTURE_IMAGE_UNITS];
263 
264     // Currently applied blend state
265     bool mForceSetBlendState;
266     gl::BlendState mCurBlendState;
267     gl::Color mCurBlendColor;
268     unsigned int mCurSampleMask;
269 
270     // Currently applied rasterizer state
271     bool mForceSetRasterState;
272     gl::RasterizerState mCurRasterState;
273 
274     // Currently applied depth stencil state
275     bool mForceSetDepthStencilState;
276     gl::DepthStencilState mCurDepthStencilState;
277     int mCurStencilRef;
278     int mCurStencilBackRef;
279 
280     // Currently applied scissor rectangle
281     bool mForceSetScissor;
282     bool mScissorEnabled;
283     gl::Rectangle mCurScissor;
284 
285     // Currently applied viewport
286     bool mForceSetViewport;
287     gl::Rectangle mCurViewport;
288     float mCurNear;
289     float mCurFar;
290 
291     // Currently applied primitive topology
292     D3D11_PRIMITIVE_TOPOLOGY mCurrentPrimitiveTopology;
293 
294     unsigned int mAppliedIBSerial;
295     unsigned int mAppliedStorageIBSerial;
296     unsigned int mAppliedIBOffset;
297 
298     unsigned int mAppliedProgramBinarySerial;
299     bool mIsGeometryShaderActive;
300 
301     dx_VertexConstants mVertexConstants;
302     dx_VertexConstants mAppliedVertexConstants;
303     ID3D11Buffer *mDriverConstantBufferVS;
304     ID3D11Buffer *mCurrentVertexConstantBuffer;
305 
306     dx_PixelConstants mPixelConstants;
307     dx_PixelConstants mAppliedPixelConstants;
308     ID3D11Buffer *mDriverConstantBufferPS;
309     ID3D11Buffer *mCurrentPixelConstantBuffer;
310 
311     ID3D11Buffer *mCurrentGeometryConstantBuffer;
312 
313     // Vertex, index and input layouts
314     VertexDataManager *mVertexDataManager;
315     IndexDataManager *mIndexDataManager;
316     InputLayoutCache mInputLayoutCache;
317 
318     StreamingIndexBufferInterface *mLineLoopIB;
319     StreamingIndexBufferInterface *mTriangleFanIB;
320 
321     // Texture copy resources
322     bool mCopyResourcesInitialized;
323     ID3D11Buffer *mCopyVB;
324     ID3D11SamplerState *mCopySampler;
325     ID3D11InputLayout *mCopyIL;
326     ID3D11VertexShader *mCopyVS;
327     ID3D11PixelShader *mCopyRGBAPS;
328     ID3D11PixelShader *mCopyRGBPS;
329     ID3D11PixelShader *mCopyLumPS;
330     ID3D11PixelShader *mCopyLumAlphaPS;
331 
332     // Masked clear resources
333     bool mClearResourcesInitialized;
334     ID3D11Buffer *mClearVB;
335     ID3D11InputLayout *mClearIL;
336     ID3D11VertexShader *mClearVS;
337     ID3D11PixelShader *mClearSinglePS;
338     ID3D11PixelShader *mClearMultiplePS;
339     ID3D11RasterizerState *mClearScissorRS;
340     ID3D11RasterizerState *mClearNoScissorRS;
341 
342     // Sync query
343     ID3D11Query *mSyncQuery;
344 
345     ID3D11Device *mDevice;
346     D3D_FEATURE_LEVEL mFeatureLevel;
347     ID3D11DeviceContext *mDeviceContext;
348     IDXGIAdapter *mDxgiAdapter;
349     DXGI_ADAPTER_DESC mAdapterDescription;
350     char mDescription[128];
351     IDXGIFactory *mDxgiFactory;
352 
353     // Cached device caps
354     bool mBGRATextureSupport;
355 };
356 
357 }
358 #endif // LIBGLESV2_RENDERER_RENDERER11_H_
359