|
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 // Renderer9.h: Defines a back-end specific class for the D3D9 renderer. |
|
8 |
|
9 #ifndef LIBGLESV2_RENDERER_RENDERER9_H_ |
|
10 #define LIBGLESV2_RENDERER_RENDERER9_H_ |
|
11 |
|
12 #include "common/angleutils.h" |
|
13 #include "libGLESv2/mathutil.h" |
|
14 #include "libGLESv2/renderer/ShaderCache.h" |
|
15 #include "libGLESv2/renderer/VertexDeclarationCache.h" |
|
16 #include "libGLESv2/renderer/Renderer.h" |
|
17 #include "libGLESv2/renderer/RenderTarget.h" |
|
18 |
|
19 namespace gl |
|
20 { |
|
21 class Renderbuffer; |
|
22 } |
|
23 |
|
24 namespace rx |
|
25 { |
|
26 class VertexDataManager; |
|
27 class IndexDataManager; |
|
28 class StreamingIndexBufferInterface; |
|
29 struct TranslatedAttribute; |
|
30 |
|
31 class Renderer9 : public Renderer |
|
32 { |
|
33 public: |
|
34 Renderer9(egl::Display *display, HDC hDc, bool softwareDevice); |
|
35 virtual ~Renderer9(); |
|
36 |
|
37 static Renderer9 *makeRenderer9(Renderer *renderer); |
|
38 |
|
39 virtual EGLint initialize(); |
|
40 virtual bool resetDevice(); |
|
41 |
|
42 virtual int generateConfigs(ConfigDesc **configDescList); |
|
43 virtual void deleteConfigs(ConfigDesc *configDescList); |
|
44 |
|
45 void startScene(); |
|
46 void endScene(); |
|
47 |
|
48 virtual void sync(bool block); |
|
49 |
|
50 virtual SwapChain *createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat); |
|
51 |
|
52 IDirect3DQuery9* allocateEventQuery(); |
|
53 void freeEventQuery(IDirect3DQuery9* query); |
|
54 |
|
55 // resource creation |
|
56 IDirect3DVertexShader9 *createVertexShader(const DWORD *function, size_t length); |
|
57 IDirect3DPixelShader9 *createPixelShader(const DWORD *function, size_t length); |
|
58 HRESULT createVertexBuffer(UINT Length, DWORD Usage, IDirect3DVertexBuffer9 **ppVertexBuffer); |
|
59 HRESULT createIndexBuffer(UINT Length, DWORD Usage, D3DFORMAT Format, IDirect3DIndexBuffer9 **ppIndexBuffer); |
|
60 #if 0 |
|
61 void *createTexture2D(); |
|
62 void *createTextureCube(); |
|
63 void *createQuery(); |
|
64 void *createIndexBuffer(); |
|
65 void *createVertexbuffer(); |
|
66 |
|
67 // state setup |
|
68 void applyShaders(); |
|
69 void applyConstants(); |
|
70 #endif |
|
71 virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler); |
|
72 virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture); |
|
73 |
|
74 virtual void setRasterizerState(const gl::RasterizerState &rasterState); |
|
75 virtual void setBlendState(const gl::BlendState &blendState, const gl::Color &blendColor, |
|
76 unsigned int sampleMask); |
|
77 virtual void setDepthStencilState(const gl::DepthStencilState &depthStencilState, int stencilRef, |
|
78 int stencilBackRef, bool frontFaceCCW); |
|
79 |
|
80 virtual void setScissorRectangle(const gl::Rectangle &scissor, bool enabled); |
|
81 virtual bool setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, |
|
82 bool ignoreViewport); |
|
83 |
|
84 virtual bool applyRenderTarget(gl::Framebuffer *frameBuffer); |
|
85 virtual void applyShaders(gl::ProgramBinary *programBinary); |
|
86 virtual void applyUniforms(gl::ProgramBinary *programBinary, gl::UniformArray *uniformArray); |
|
87 virtual bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount); |
|
88 virtual GLenum applyVertexBuffer(gl::ProgramBinary *programBinary, gl::VertexAttribute vertexAttributes[], GLint first, GLsizei count, GLsizei instances); |
|
89 virtual GLenum applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo); |
|
90 |
|
91 virtual void drawArrays(GLenum mode, GLsizei count, GLsizei instances); |
|
92 virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances); |
|
93 |
|
94 virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); |
|
95 |
|
96 virtual void markAllStateDirty(); |
|
97 |
|
98 // lost device |
|
99 void notifyDeviceLost(); |
|
100 virtual bool isDeviceLost(); |
|
101 virtual bool testDeviceLost(bool notify); |
|
102 virtual bool testDeviceResettable(); |
|
103 |
|
104 // Renderer capabilities |
|
105 IDirect3DDevice9 *getDevice() { return mDevice; } |
|
106 virtual DWORD getAdapterVendor() const; |
|
107 virtual std::string getRendererDescription() const; |
|
108 virtual GUID getAdapterIdentifier() const; |
|
109 |
|
110 virtual bool getBGRATextureSupport() const; |
|
111 virtual bool getDXT1TextureSupport(); |
|
112 virtual bool getDXT3TextureSupport(); |
|
113 virtual bool getDXT5TextureSupport(); |
|
114 virtual bool getEventQuerySupport(); |
|
115 virtual bool getFloat32TextureSupport(bool *filtering, bool *renderable); |
|
116 virtual bool getFloat16TextureSupport(bool *filtering, bool *renderable); |
|
117 virtual bool getLuminanceTextureSupport(); |
|
118 virtual bool getLuminanceAlphaTextureSupport(); |
|
119 virtual unsigned int getMaxVertexTextureImageUnits() const; |
|
120 virtual unsigned int getMaxCombinedTextureImageUnits() const; |
|
121 virtual unsigned int getReservedVertexUniformVectors() const; |
|
122 virtual unsigned int getReservedFragmentUniformVectors() const; |
|
123 virtual unsigned int getMaxVertexUniformVectors() const; |
|
124 virtual unsigned int getMaxFragmentUniformVectors() const; |
|
125 virtual unsigned int getMaxVaryingVectors() const; |
|
126 virtual bool getNonPower2TextureSupport() const; |
|
127 virtual bool getDepthTextureSupport() const; |
|
128 virtual bool getOcclusionQuerySupport() const; |
|
129 virtual bool getInstancingSupport() const; |
|
130 virtual bool getTextureFilterAnisotropySupport() const; |
|
131 virtual float getTextureMaxAnisotropy() const; |
|
132 virtual bool getShareHandleSupport() const; |
|
133 virtual bool getDerivativeInstructionSupport() const; |
|
134 virtual bool getPostSubBufferSupport() const; |
|
135 |
|
136 virtual int getMajorShaderModel() const; |
|
137 virtual float getMaxPointSize() const; |
|
138 virtual int getMaxViewportDimension() const; |
|
139 virtual int getMaxTextureWidth() const; |
|
140 virtual int getMaxTextureHeight() const; |
|
141 virtual bool get32BitIndexSupport() const; |
|
142 DWORD getCapsDeclTypes() const; |
|
143 virtual int getMinSwapInterval() const; |
|
144 virtual int getMaxSwapInterval() const; |
|
145 |
|
146 virtual GLsizei getMaxSupportedSamples() const; |
|
147 int getNearestSupportedSamples(D3DFORMAT format, int requested) const; |
|
148 |
|
149 virtual unsigned int getMaxRenderTargets() const; |
|
150 |
|
151 D3DFORMAT ConvertTextureInternalFormat(GLint internalformat); |
|
152 |
|
153 // Pixel operations |
|
154 virtual bool copyToRenderTarget(TextureStorageInterface2D *dest, TextureStorageInterface2D *source); |
|
155 virtual bool copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureStorageInterfaceCube *source); |
|
156 |
|
157 virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, |
|
158 GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level); |
|
159 virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, |
|
160 GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level); |
|
161 |
|
162 virtual bool blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, const gl::Rectangle &drawRect, |
|
163 bool blitRenderTarget, bool blitDepthStencil); |
|
164 virtual void readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, |
|
165 GLsizei outputPitch, bool packReverseRowOrder, GLint packAlignment, void* pixels); |
|
166 |
|
167 // RenderTarget creation |
|
168 virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth); |
|
169 virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth); |
|
170 |
|
171 // Shader operations |
|
172 virtual ShaderExecutable *loadExecutable(const void *function, size_t length, rx::ShaderType type); |
|
173 virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, rx::ShaderType type); |
|
174 |
|
175 // Image operations |
|
176 virtual Image *createImage(); |
|
177 virtual void generateMipmap(Image *dest, Image *source); |
|
178 virtual TextureStorage *createTextureStorage2D(SwapChain *swapChain); |
|
179 virtual TextureStorage *createTextureStorage2D(int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height); |
|
180 virtual TextureStorage *createTextureStorageCube(int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size); |
|
181 |
|
182 // Buffer creation |
|
183 virtual VertexBuffer *createVertexBuffer(); |
|
184 virtual IndexBuffer *createIndexBuffer(); |
|
185 virtual BufferStorage *createBufferStorage(); |
|
186 |
|
187 // Query and Fence creation |
|
188 virtual QueryImpl *createQuery(GLenum type); |
|
189 virtual FenceImpl *createFence(); |
|
190 |
|
191 // D3D9-renderer specific methods |
|
192 bool boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest); |
|
193 |
|
194 D3DPOOL getTexturePool(DWORD usage) const; |
|
195 |
|
196 virtual bool getLUID(LUID *adapterLuid) const; |
|
197 |
|
198 private: |
|
199 DISALLOW_COPY_AND_ASSIGN(Renderer9); |
|
200 |
|
201 void applyUniformnfv(gl::Uniform *targetUniform, const GLfloat *v); |
|
202 void applyUniformniv(gl::Uniform *targetUniform, const GLint *v); |
|
203 void applyUniformnbv(gl::Uniform *targetUniform, const GLint *v); |
|
204 |
|
205 void drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer); |
|
206 void drawIndexedPoints(GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer); |
|
207 |
|
208 void getMultiSampleSupport(D3DFORMAT format, bool *multiSampleArray); |
|
209 bool copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged); |
|
210 gl::Renderbuffer *getNullColorbuffer(gl::Renderbuffer *depthbuffer); |
|
211 |
|
212 D3DPOOL getBufferPool(DWORD usage) const; |
|
213 |
|
214 HMODULE mD3d9Module; |
|
215 HDC mDc; |
|
216 |
|
217 void initializeDevice(); |
|
218 D3DPRESENT_PARAMETERS getDefaultPresentParameters(); |
|
219 void releaseDeviceResources(); |
|
220 |
|
221 UINT mAdapter; |
|
222 D3DDEVTYPE mDeviceType; |
|
223 bool mSoftwareDevice; // FIXME: Deprecate |
|
224 IDirect3D9 *mD3d9; // Always valid after successful initialization. |
|
225 IDirect3D9Ex *mD3d9Ex; // Might be null if D3D9Ex is not supported. |
|
226 IDirect3DDevice9 *mDevice; |
|
227 IDirect3DDevice9Ex *mDeviceEx; // Might be null if D3D9Ex is not supported. |
|
228 |
|
229 Blit *mBlit; |
|
230 |
|
231 HWND mDeviceWindow; |
|
232 |
|
233 bool mDeviceLost; |
|
234 D3DCAPS9 mDeviceCaps; |
|
235 D3DADAPTER_IDENTIFIER9 mAdapterIdentifier; |
|
236 |
|
237 D3DPRIMITIVETYPE mPrimitiveType; |
|
238 int mPrimitiveCount; |
|
239 GLsizei mRepeatDraw; |
|
240 |
|
241 bool mSceneStarted; |
|
242 bool mSupportsNonPower2Textures; |
|
243 bool mSupportsTextureFilterAnisotropy; |
|
244 int mMinSwapInterval; |
|
245 int mMaxSwapInterval; |
|
246 |
|
247 bool mOcclusionQuerySupport; |
|
248 bool mEventQuerySupport; |
|
249 bool mVertexTextureSupport; |
|
250 |
|
251 bool mDepthTextureSupport; |
|
252 |
|
253 bool mFloat32TextureSupport; |
|
254 bool mFloat32FilterSupport; |
|
255 bool mFloat32RenderSupport; |
|
256 |
|
257 bool mFloat16TextureSupport; |
|
258 bool mFloat16FilterSupport; |
|
259 bool mFloat16RenderSupport; |
|
260 |
|
261 bool mDXT1TextureSupport; |
|
262 bool mDXT3TextureSupport; |
|
263 bool mDXT5TextureSupport; |
|
264 |
|
265 bool mLuminanceTextureSupport; |
|
266 bool mLuminanceAlphaTextureSupport; |
|
267 |
|
268 std::map<D3DFORMAT, bool *> mMultiSampleSupport; |
|
269 GLsizei mMaxSupportedSamples; |
|
270 |
|
271 // current render target states |
|
272 unsigned int mAppliedRenderTargetSerial; |
|
273 unsigned int mAppliedDepthbufferSerial; |
|
274 unsigned int mAppliedStencilbufferSerial; |
|
275 bool mDepthStencilInitialized; |
|
276 bool mRenderTargetDescInitialized; |
|
277 rx::RenderTarget::Desc mRenderTargetDesc; |
|
278 unsigned int mCurStencilSize; |
|
279 unsigned int mCurDepthSize; |
|
280 |
|
281 IDirect3DStateBlock9 *mMaskedClearSavedState; |
|
282 |
|
283 // previously set render states |
|
284 bool mForceSetDepthStencilState; |
|
285 gl::DepthStencilState mCurDepthStencilState; |
|
286 int mCurStencilRef; |
|
287 int mCurStencilBackRef; |
|
288 bool mCurFrontFaceCCW; |
|
289 |
|
290 bool mForceSetRasterState; |
|
291 gl::RasterizerState mCurRasterState; |
|
292 |
|
293 bool mForceSetScissor; |
|
294 gl::Rectangle mCurScissor; |
|
295 bool mScissorEnabled; |
|
296 |
|
297 bool mForceSetViewport; |
|
298 gl::Rectangle mCurViewport; |
|
299 float mCurNear; |
|
300 float mCurFar; |
|
301 |
|
302 bool mForceSetBlendState; |
|
303 gl::BlendState mCurBlendState; |
|
304 gl::Color mCurBlendColor; |
|
305 GLuint mCurSampleMask; |
|
306 |
|
307 // Currently applied sampler states |
|
308 bool mForceSetVertexSamplerStates[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; |
|
309 gl::SamplerState mCurVertexSamplerStates[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; |
|
310 |
|
311 bool mForceSetPixelSamplerStates[gl::MAX_TEXTURE_IMAGE_UNITS]; |
|
312 gl::SamplerState mCurPixelSamplerStates[gl::MAX_TEXTURE_IMAGE_UNITS]; |
|
313 |
|
314 // Currently applied textures |
|
315 unsigned int mCurVertexTextureSerials[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; |
|
316 unsigned int mCurPixelTextureSerials[gl::MAX_TEXTURE_IMAGE_UNITS]; |
|
317 |
|
318 unsigned int mAppliedIBSerial; |
|
319 unsigned int mAppliedProgramBinarySerial; |
|
320 |
|
321 rx::dx_VertexConstants mVertexConstants; |
|
322 rx::dx_PixelConstants mPixelConstants; |
|
323 bool mDxUniformsDirty; |
|
324 |
|
325 // A pool of event queries that are currently unused. |
|
326 std::vector<IDirect3DQuery9*> mEventQueryPool; |
|
327 VertexShaderCache mVertexShaderCache; |
|
328 PixelShaderCache mPixelShaderCache; |
|
329 |
|
330 VertexDataManager *mVertexDataManager; |
|
331 VertexDeclarationCache mVertexDeclarationCache; |
|
332 |
|
333 IndexDataManager *mIndexDataManager; |
|
334 StreamingIndexBufferInterface *mLineLoopIB; |
|
335 |
|
336 enum { NUM_NULL_COLORBUFFER_CACHE_ENTRIES = 12 }; |
|
337 struct NullColorbufferCacheEntry |
|
338 { |
|
339 UINT lruCount; |
|
340 int width; |
|
341 int height; |
|
342 gl::Renderbuffer *buffer; |
|
343 } mNullColorbufferCache[NUM_NULL_COLORBUFFER_CACHE_ENTRIES]; |
|
344 UINT mMaxNullColorbufferLRU; |
|
345 |
|
346 }; |
|
347 |
|
348 } |
|
349 #endif // LIBGLESV2_RENDERER_RENDERER9_H_ |