blob: ce730b70a2e887b7c1a0b7d769fd321a13631f98 [file] [log] [blame]
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +00001//
daniel@transgaming.coma390e1e2013-01-11 04:09:39 +00002// Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +00003// 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#define GL_APICALL
13#include <GLES2/gl2.h>
14#include <GLES2/gl2ext.h>
15#define EGLAPI
16#include <EGL/egl.h>
17
18#include <dxgi.h>
19#include <d3d11.h>
daniel@transgaming.com04af90f2012-11-28 21:03:09 +000020#include <D3Dcompiler.h>
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000021
22#include "common/angleutils.h"
daniel@transgaming.com6c872172012-11-28 19:39:33 +000023#include "libGLESv2/angletypes.h"
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000024
25#include "libGLESv2/renderer/Renderer.h"
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +000026#include "libGLESv2/renderer/RenderStateCache.h"
daniel@transgaming.comc5431eb2012-12-20 21:10:15 +000027#include "libGLESv2/renderer/InputLayoutCache.h"
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000028
29namespace rx
30{
31
daniel@transgaming.comc5431eb2012-12-20 21:10:15 +000032class VertexDataManager;
33class IndexDataManager;
daniel@transgaming.comc5114302012-12-20 21:11:36 +000034class StreamingIndexBufferInterface;
daniel@transgaming.comc5431eb2012-12-20 21:10:15 +000035
shannon.woods@transgaming.com4e482042013-01-25 21:54:18 +000036enum
37{
38 MAX_VERTEX_UNIFORM_VECTORS_D3D11 = 1024,
39 MAX_FRAGMENT_UNIFORM_VECTORS_D3D11 = 1024
40};
41
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000042class Renderer11 : public Renderer
43{
44 public:
45 Renderer11(egl::Display *display, HDC hDc);
46 virtual ~Renderer11();
47
daniel@transgaming.comb64ed282012-11-28 20:54:02 +000048 static Renderer11 *makeRenderer11(Renderer *renderer);
49
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000050 virtual EGLint initialize();
51 virtual bool resetDevice();
52
53 virtual int generateConfigs(ConfigDesc **configDescList);
54 virtual void deleteConfigs(ConfigDesc *configDescList);
55
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000056 virtual void sync(bool block);
57
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +000058 virtual SwapChain *createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
59
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000060 virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler);
61 virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture);
62
daniel@transgaming.com237bc7e2012-11-28 21:01:06 +000063 virtual void setRasterizerState(const gl::RasterizerState &rasterState);
daniel@transgaming.com493d4f82012-11-28 19:35:45 +000064 virtual void setBlendState(const gl::BlendState &blendState, const gl::Color &blendColor,
65 unsigned int sampleMask);
daniel@transgaming.com08c331d2012-11-28 19:38:39 +000066 virtual void setDepthStencilState(const gl::DepthStencilState &depthStencilState, int stencilRef,
daniel@transgaming.com3a0ef482012-11-28 21:01:20 +000067 int stencilBackRef, bool frontFaceCCW);
daniel@transgaming.com493d4f82012-11-28 19:35:45 +000068
daniel@transgaming.comd55e8c12012-11-28 21:07:02 +000069 virtual void setScissorRectangle(const gl::Rectangle &scissor, bool enabled);
daniel@transgaming.com12985182012-12-20 20:56:31 +000070 virtual bool setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace,
daniel@transgaming.comed36abd2013-01-11 21:15:58 +000071 bool ignoreViewport, gl::ProgramBinary *currentProgram);
daniel@transgaming.com493d4f82012-11-28 19:35:45 +000072
daniel@transgaming.com91207b72012-11-28 20:56:43 +000073 virtual bool applyPrimitiveType(GLenum mode, GLsizei count);
daniel@transgaming.comae39ee22012-11-28 19:42:02 +000074 virtual bool applyRenderTarget(gl::Framebuffer *frameBuffer);
daniel@transgaming.com5fbf1772012-11-28 20:54:43 +000075 virtual void applyShaders(gl::ProgramBinary *programBinary);
shannon.woods@transgaming.com21ba6472013-01-25 21:53:32 +000076 virtual void applyUniforms(gl::ProgramBinary *programBinary, gl::UniformArray *uniformArray);
daniel@transgaming.com91207b72012-11-28 20:56:43 +000077 virtual GLenum applyVertexBuffer(gl::ProgramBinary *programBinary, gl::VertexAttribute vertexAttributes[], GLint first, GLsizei count, GLsizei instances);
daniel@transgaming.com31240482012-11-28 21:06:41 +000078 virtual GLenum applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
daniel@transgaming.com493d4f82012-11-28 19:35:45 +000079
daniel@transgaming.com91207b72012-11-28 20:56:43 +000080 virtual void drawArrays(GLenum mode, GLsizei count, GLsizei instances);
daniel@transgaming.com31240482012-11-28 21:06:41 +000081 virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo);
daniel@transgaming.comdef9f0f2012-11-28 20:53:20 +000082
daniel@transgaming.com084a2572012-11-28 20:55:17 +000083 virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer);
daniel@transgaming.comd084c622012-11-28 19:36:05 +000084
daniel@transgaming.comc43a6052012-11-28 19:41:51 +000085 virtual void markAllStateDirty();
86
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000087 // lost device
88 virtual void markDeviceLost();
89 virtual bool isDeviceLost();
90 virtual bool testDeviceLost(bool notify);
91 virtual bool testDeviceResettable();
92
93 // Renderer capabilities
94 virtual DWORD getAdapterVendor() const;
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +000095 virtual std::string getRendererDescription() const;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000096 virtual GUID getAdapterIdentifier() const;
97
shannon.woods@transgaming.combec04bf2013-01-25 21:53:52 +000098 virtual bool getBGRATextureSupport() const;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000099 virtual bool getDXT1TextureSupport();
100 virtual bool getDXT3TextureSupport();
101 virtual bool getDXT5TextureSupport();
102 virtual bool getEventQuerySupport();
103 virtual bool getFloat32TextureSupport(bool *filtering, bool *renderable);
104 virtual bool getFloat16TextureSupport(bool *filtering, bool *renderable);
105 virtual bool getLuminanceTextureSupport();
106 virtual bool getLuminanceAlphaTextureSupport();
shannon.woods@transgaming.com233fe952013-01-25 21:51:57 +0000107 virtual unsigned int getMaxVertexTextureImageUnits() const;
shannon.woods@transgaming.com76cd88c2013-01-25 21:54:36 +0000108 virtual unsigned int getMaxCombinedTextureImageUnits() const;
shannon.woods@transgaming.com254317d2013-01-25 21:54:09 +0000109 virtual int getMaxVertexUniformVectors() const;
110 virtual int getMaxFragmentUniformVectors() const;
shannon.woods@transgaming.com28d268e2013-01-25 21:54:26 +0000111 virtual int getMaxVaryingVectors() const;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000112 virtual bool getNonPower2TextureSupport() const;
113 virtual bool getDepthTextureSupport() const;
114 virtual bool getOcclusionQuerySupport() const;
115 virtual bool getInstancingSupport() const;
116 virtual bool getTextureFilterAnisotropySupport() const;
117 virtual float getTextureMaxAnisotropy() const;
118 virtual bool getShareHandleSupport() const;
daniel@transgaming.com7629bb62013-01-11 04:12:28 +0000119 virtual bool getDerivativeInstructionSupport() const;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000120
daniel@transgaming.com9549bea2012-11-28 20:57:23 +0000121 virtual int getMajorShaderModel() const;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000122 virtual float getMaxPointSize() const;
123 virtual int getMaxTextureWidth() const;
124 virtual int getMaxTextureHeight() const;
125 virtual bool get32BitIndexSupport() const;
126 virtual int getMinSwapInterval() const;
127 virtual int getMaxSwapInterval() const;
128
129 virtual GLsizei getMaxSupportedSamples() const;
130
daniel@transgaming.coma9c71422012-11-28 20:58:45 +0000131 // Pixel operations
daniel@transgaming.com87705f82012-12-20 21:10:45 +0000132 virtual bool copyToRenderTarget(TextureStorageInterface2D *dest, TextureStorageInterface2D *source);
133 virtual bool copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureStorageInterfaceCube *source);
daniel@transgaming.comad6aee72012-11-28 19:33:42 +0000134
shannon.woods@transgaming.com664916b2013-01-25 21:50:32 +0000135 virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
daniel@transgaming.com87705f82012-12-20 21:10:45 +0000136 GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level);
shannon.woods@transgaming.com664916b2013-01-25 21:50:32 +0000137 virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
daniel@transgaming.com87705f82012-12-20 21:10:45 +0000138 GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level);
daniel@transgaming.com38380882012-11-28 19:36:39 +0000139
shannon.woods@transgaming.com9d971ff2013-01-25 21:50:53 +0000140 bool copyTexture(ID3D11ShaderResourceView *source, const gl::Rectangle &sourceArea, unsigned int sourceWidth, unsigned int sourceHeight,
141 ID3D11RenderTargetView *dest, const gl::Rectangle &destArea, unsigned int destWidth, unsigned int destHeight, GLenum destFormat);
142
daniel@transgaming.com6c872172012-11-28 19:39:33 +0000143 virtual bool blitRect(gl::Framebuffer *readTarget, gl::Rectangle *readRect, gl::Framebuffer *drawTarget, gl::Rectangle *drawRect,
144 bool blitRenderTarget, bool blitDepthStencil);
145 virtual void readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
146 GLsizei outputPitch, bool packReverseRowOrder, GLint packAlignment, void* pixels);
147
daniel@transgaming.coma9c71422012-11-28 20:58:45 +0000148 // RenderTarget creation
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000149 virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth);
150 virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth);
151
daniel@transgaming.coma9c71422012-11-28 20:58:45 +0000152 // Shader operations
daniel@transgaming.com2275f912012-12-20 21:13:22 +0000153 virtual ShaderExecutable *loadExecutable(const void *function, size_t length, GLenum type);
daniel@transgaming.coma9c71422012-11-28 20:58:45 +0000154 virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type);
155
daniel@transgaming.com244e1832012-12-20 20:52:35 +0000156 // Image operations
157 virtual Image *createImage();
daniel@transgaming.comf721fdb2012-12-20 20:53:11 +0000158 virtual void generateMipmap(Image *dest, Image *source);
daniel@transgaming.com413d2712012-12-20 21:11:04 +0000159 virtual TextureStorage *createTextureStorage2D(SwapChain *swapChain);
160 virtual TextureStorage *createTextureStorage2D(int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height);
161 virtual TextureStorage *createTextureStorageCube(int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size);
daniel@transgaming.com244e1832012-12-20 20:52:35 +0000162
daniel@transgaming.com3f255b42012-12-20 21:07:35 +0000163 // Buffer creation
164 virtual VertexBuffer *createVertexBuffer();
daniel@transgaming.com0b6d7742012-12-20 21:09:47 +0000165 virtual IndexBuffer *createIndexBuffer();
daniel@transgaming.com3f255b42012-12-20 21:07:35 +0000166
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000167 // D3D11-renderer specific methods
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000168 ID3D11Device *getDevice() { return mDevice; }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000169 ID3D11DeviceContext *getDeviceContext() { return mDeviceContext; };
daniel@transgaming.coma60160b2012-11-28 19:41:15 +0000170 IDXGIFactory *getDxgiFactory() { return mDxgiFactory; };
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000171
shannon.woods@transgaming.comfdeacb82013-01-25 21:52:34 +0000172 bool getRenderTargetResource(gl::Framebuffer *framebuffer, unsigned int *subresourceIndex, ID3D11Texture2D **resource);
173
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000174 private:
175 DISALLOW_COPY_AND_ASSIGN(Renderer11);
176
daniel@transgaming.comc5114302012-12-20 21:11:36 +0000177 void drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
daniel@transgaming.com4fd1f982013-01-11 04:12:58 +0000178 void drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
daniel@transgaming.comc5114302012-12-20 21:11:36 +0000179
daniel@transgaming.comee42a0a2013-01-11 04:09:15 +0000180 void readTextureData(ID3D11Texture2D *texture, unsigned int subResource, const gl::Rectangle &area,
181 GLenum format, GLenum type, GLsizei outputPitch, bool packReverseRowOrder,
182 GLint packAlignment, void *pixels);
183
shannon.woods@transgaming.com34f507c2013-01-25 21:52:15 +0000184 void maskedClear(const gl::ClearParameters &clearParams);
185
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000186 HMODULE mD3d11Module;
187 HMODULE mDxgiModule;
188 HDC mDc;
189
190 bool mDeviceLost;
191
192 void initializeDevice();
193 void releaseDeviceResources();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000194 int getMinorShaderModel() const;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000195
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +0000196 RenderStateCache mStateCache;
197
daniel@transgaming.com7b6b83e2012-11-28 21:00:30 +0000198 // current render target states
daniel@transgaming.com80fc3322012-11-28 21:02:13 +0000199 unsigned int mAppliedRenderTargetSerial;
200 unsigned int mAppliedDepthbufferSerial;
201 unsigned int mAppliedStencilbufferSerial;
daniel@transgaming.com7b6b83e2012-11-28 21:00:30 +0000202 bool mDepthStencilInitialized;
203 bool mRenderTargetDescInitialized;
204 rx::RenderTarget::Desc mRenderTargetDesc;
205 unsigned int mCurDepthSize;
daniel@transgaming.com80fc3322012-11-28 21:02:13 +0000206 unsigned int mCurStencilSize;
daniel@transgaming.com7b6b83e2012-11-28 21:00:30 +0000207
daniel@transgaming.com54de24f2013-01-11 04:07:59 +0000208 // Currently applied sampler states
shannon.woods@transgaming.com233fe952013-01-25 21:51:57 +0000209 bool mForceSetVertexSamplerStates[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
210 gl::SamplerState mCurVertexSamplerStates[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
daniel@transgaming.com54de24f2013-01-11 04:07:59 +0000211
212 bool mForceSetPixelSamplerStates[gl::MAX_TEXTURE_IMAGE_UNITS];
213 gl::SamplerState mCurPixelSamplerStates[gl::MAX_TEXTURE_IMAGE_UNITS];
214
daniel@transgaming.come33c8bf2013-01-11 04:11:33 +0000215 // Currently applied textures
shannon.woods@transgaming.com233fe952013-01-25 21:51:57 +0000216 unsigned int mCurVertexTextureSerials[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
daniel@transgaming.come33c8bf2013-01-11 04:11:33 +0000217 unsigned int mCurPixelTextureSerials[gl::MAX_TEXTURE_IMAGE_UNITS];
218
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +0000219 // Currently applied blend state
220 bool mForceSetBlendState;
221 gl::BlendState mCurBlendState;
222 gl::Color mCurBlendColor;
223 unsigned int mCurSampleMask;
224
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000225 // Currently applied rasterizer state
226 bool mForceSetRasterState;
227 gl::RasterizerState mCurRasterState;
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000228
daniel@transgaming.com5503fd02012-11-28 19:38:57 +0000229 // Currently applied depth stencil state
230 bool mForceSetDepthStencilState;
231 gl::DepthStencilState mCurDepthStencilState;
232 int mCurStencilRef;
233 int mCurStencilBackRef;
234
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000235 // Currently applied scissor rectangle
236 bool mForceSetScissor;
daniel@transgaming.comd55e8c12012-11-28 21:07:02 +0000237 bool mScissorEnabled;
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000238 gl::Rectangle mCurScissor;
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000239
daniel@transgaming.com53670042012-11-28 20:55:51 +0000240 // Currently applied viewport
241 bool mForceSetViewport;
242 gl::Rectangle mCurViewport;
243 float mCurNear;
244 float mCurFar;
245
daniel@transgaming.comc5431eb2012-12-20 21:10:15 +0000246 unsigned int mAppliedIBSerial;
daniel@transgaming.com7fbf4862013-01-11 04:09:22 +0000247 unsigned int mAppliedIBOffset;
248
daniel@transgaming.come4991412012-12-20 20:55:34 +0000249 unsigned int mAppliedProgramBinarySerial;
250
shannon.woods@transgaming.com5fb979d2013-01-25 21:53:04 +0000251 dx_VertexConstants mVertexConstants;
252 dx_VertexConstants mAppliedVertexConstants;
253 ID3D11Buffer *mDriverConstantBufferVS;
254
255 dx_PixelConstants mPixelConstants;
256 dx_PixelConstants mAppliedPixelConstants;
257 ID3D11Buffer *mDriverConstantBufferPS;
daniel@transgaming.comed36abd2013-01-11 21:15:58 +0000258
daniel@transgaming.comc5431eb2012-12-20 21:10:15 +0000259 // Vertex, index and input layouts
260 VertexDataManager *mVertexDataManager;
261 IndexDataManager *mIndexDataManager;
262 InputLayoutCache mInputLayoutCache;
263
daniel@transgaming.comc5114302012-12-20 21:11:36 +0000264 StreamingIndexBufferInterface *mLineLoopIB;
daniel@transgaming.com4fd1f982013-01-11 04:12:58 +0000265 StreamingIndexBufferInterface *mTriangleFanIB;
daniel@transgaming.comc5114302012-12-20 21:11:36 +0000266
shannon.woods@transgaming.com9d971ff2013-01-25 21:50:53 +0000267 // Texture copy resources
268 bool mCopyResourcesInitialized;
269 ID3D11Buffer *mCopyVB;
270 ID3D11SamplerState *mCopySampler;
271 ID3D11InputLayout *mCopyIL;
272 ID3D11VertexShader *mCopyVS;
273 ID3D11PixelShader *mCopyRGBAPS;
274 ID3D11PixelShader *mCopyRGBPS;
275 ID3D11PixelShader *mCopyLumPS;
276 ID3D11PixelShader *mCopyLumAlphaPS;
277
shannon.woods@transgaming.com34f507c2013-01-25 21:52:15 +0000278 // Masked clear resources
279 bool mClearResourcesInitialized;
280 ID3D11Buffer *mClearVB;
281 ID3D11InputLayout *mClearIL;
282 ID3D11VertexShader *mClearVS;
283 ID3D11PixelShader *mClearPS;
284 ID3D11RasterizerState *mClearScissorRS;
285 ID3D11RasterizerState *mClearNoScissorRS;
286
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000287 ID3D11Device *mDevice;
288 D3D_FEATURE_LEVEL mFeatureLevel;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000289 ID3D11DeviceContext *mDeviceContext;
daniel@transgaming.com65e65372012-11-28 19:33:50 +0000290 IDXGIAdapter *mDxgiAdapter;
daniel@transgaming.com1f811f52012-11-28 20:57:39 +0000291 DXGI_ADAPTER_DESC mAdapterDescription;
292 char mDescription[128];
daniel@transgaming.coma60160b2012-11-28 19:41:15 +0000293 IDXGIFactory *mDxgiFactory;
shannon.woods@transgaming.combec04bf2013-01-25 21:53:52 +0000294
295 // Cached device caps
296 bool mBGRATextureSupport;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000297};
298
299}
300#endif // LIBGLESV2_RENDERER_RENDERER11_H_