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