1 // 2 // Copyright 2012 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 LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_ 10 #define LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_ 11 12 #include "common/angleutils.h" 13 #include "common/mathutil.h" 14 #include "libANGLE/AttributeMap.h" 15 #include "libANGLE/angletypes.h" 16 #include "libANGLE/renderer/d3d/HLSLCompiler.h" 17 #include "libANGLE/renderer/d3d/ProgramD3D.h" 18 #include "libANGLE/renderer/d3d/RenderTargetD3D.h" 19 #include "libANGLE/renderer/d3d/RendererD3D.h" 20 #include "libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h" 21 #include "libANGLE/renderer/d3d/d3d11/RenderStateCache.h" 22 #include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" 23 #include "libANGLE/renderer/d3d/d3d11/StateManager11.h" 24 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" 25 26 namespace gl 27 { 28 class FramebufferAttachment; 29 class ImageIndex; 30 } // namespace gl 31 32 namespace rx 33 { 34 class Blit11; 35 class Buffer11; 36 class Clear11; 37 class Context11; 38 class IndexDataManager; 39 struct PackPixelsParams; 40 class PixelTransfer11; 41 class RenderTarget11; 42 class StreamingIndexBufferInterface; 43 class Trim11; 44 class VertexDataManager; 45 46 struct Renderer11DeviceCaps 47 { 48 Renderer11DeviceCaps(); 49 50 D3D_FEATURE_LEVEL featureLevel; 51 bool supportsDXGI1_2; // Support for DXGI 1.2 52 bool supportsClearView; // Support for ID3D11DeviceContext1::ClearView 53 bool supportsConstantBufferOffsets; // Support for Constant buffer offset 54 bool supportsVpRtIndexWriteFromVertexShader; // VP/RT can be selected in the Vertex Shader 55 // stage. 56 bool supportsMultisampledDepthStencilSRVs; // D3D feature level 10.0 no longer allows creation 57 // of textures with both the bind SRV and DSV flags 58 // when multisampled. Textures will need to be 59 // resolved before reading. crbug.com/656989 60 bool allowES3OnFL10_0; 61 UINT B5G6R5support; // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B5G6R5_UNORM 62 UINT B5G6R5maxSamples; // Maximum number of samples supported by DXGI_FORMAT_B5G6R5_UNORM 63 UINT B4G4R4A4support; // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B4G4R4A4_UNORM 64 UINT B4G4R4A4maxSamples; // Maximum number of samples supported by DXGI_FORMAT_B4G4R4A4_UNORM 65 UINT B5G5R5A1support; // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B5G5R5A1_UNORM 66 UINT B5G5R5A1maxSamples; // Maximum number of samples supported by DXGI_FORMAT_B5G5R5A1_UNORM 67 Optional<LARGE_INTEGER> driverVersion; // Four-part driver version number. 68 }; 69 70 enum 71 { 72 MAX_VERTEX_UNIFORM_VECTORS_D3D11 = 1024, 73 MAX_FRAGMENT_UNIFORM_VECTORS_D3D11 = 1024 74 }; 75 76 class Renderer11 : public RendererD3D 77 { 78 public: 79 explicit Renderer11(egl::Display *display); 80 ~Renderer11() override; 81 82 egl::Error initialize() override; 83 bool resetDevice() override; 84 85 egl::ConfigSet generateConfigs() override; 86 void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const override; 87 88 ContextImpl *createContext(const gl::State &state, gl::ErrorSet *errorSet) override; 89 90 angle::Result flush(Context11 *context11); 91 angle::Result finish(Context11 *context11); 92 93 bool isValidNativeWindow(EGLNativeWindowType window) const override; 94 NativeWindowD3D *createNativeWindow(EGLNativeWindowType window, 95 const egl::Config *config, 96 const egl::AttributeMap &attribs) const override; 97 98 SwapChainD3D *createSwapChain(NativeWindowD3D *nativeWindow, 99 HANDLE shareHandle, 100 IUnknown *d3dTexture, 101 GLenum backBufferFormat, 102 GLenum depthBufferFormat, 103 EGLint orientation, 104 EGLint samples) override; 105 egl::Error getD3DTextureInfo(const egl::Config *configuration, 106 IUnknown *d3dTexture, 107 const egl::AttributeMap &attribs, 108 EGLint *width, 109 EGLint *height, 110 GLsizei *samples, 111 gl::Format *glFormat, 112 const angle::Format **angleFormat, 113 UINT *arraySlice) const override; 114 egl::Error validateShareHandle(const egl::Config *config, 115 HANDLE shareHandle, 116 const egl::AttributeMap &attribs) const override; 117 118 // lost device 119 bool testDeviceLost() override; 120 bool testDeviceResettable() override; 121 122 DeviceIdentifier getAdapterIdentifier() const override; 123 124 unsigned int getReservedVertexUniformVectors() const; 125 unsigned int getReservedFragmentUniformVectors() const; 126 gl::ShaderMap<unsigned int> getReservedShaderUniformBuffers() const; 127 128 bool getShareHandleSupport() const; 129 130 int getMajorShaderModel() const override; 131 int getMinorShaderModel() const override; 132 std::string getShaderModelSuffix() const override; 133 134 // Pixel operations 135 angle::Result copyImage2D(const gl::Context *context, 136 const gl::Framebuffer *framebuffer, 137 const gl::Rectangle &sourceRect, 138 GLenum destFormat, 139 const gl::Offset &destOffset, 140 TextureStorage *storage, 141 GLint level) override; 142 angle::Result copyImageCube(const gl::Context *context, 143 const gl::Framebuffer *framebuffer, 144 const gl::Rectangle &sourceRect, 145 GLenum destFormat, 146 const gl::Offset &destOffset, 147 TextureStorage *storage, 148 gl::TextureTarget target, 149 GLint level) override; 150 angle::Result copyImage3D(const gl::Context *context, 151 const gl::Framebuffer *framebuffer, 152 const gl::Rectangle &sourceRect, 153 GLenum destFormat, 154 const gl::Offset &destOffset, 155 TextureStorage *storage, 156 GLint level) override; 157 angle::Result copyImage2DArray(const gl::Context *context, 158 const gl::Framebuffer *framebuffer, 159 const gl::Rectangle &sourceRect, 160 GLenum destFormat, 161 const gl::Offset &destOffset, 162 TextureStorage *storage, 163 GLint level) override; 164 165 angle::Result copyTexture(const gl::Context *context, 166 const gl::Texture *source, 167 GLint sourceLevel, 168 gl::TextureTarget srcTarget, 169 const gl::Box &sourceBox, 170 GLenum destFormat, 171 GLenum destType, 172 const gl::Offset &destOffset, 173 TextureStorage *storage, 174 gl::TextureTarget destTarget, 175 GLint destLevel, 176 bool unpackFlipY, 177 bool unpackPremultiplyAlpha, 178 bool unpackUnmultiplyAlpha) override; 179 angle::Result copyCompressedTexture(const gl::Context *context, 180 const gl::Texture *source, 181 GLint sourceLevel, 182 TextureStorage *storage, 183 GLint destLevel) override; 184 185 // RenderTarget creation 186 angle::Result createRenderTarget(const gl::Context *context, 187 int width, 188 int height, 189 GLenum format, 190 GLsizei samples, 191 RenderTargetD3D **outRT) override; 192 angle::Result createRenderTargetCopy(const gl::Context *context, 193 RenderTargetD3D *source, 194 RenderTargetD3D **outRT) override; 195 196 // Shader operations 197 angle::Result loadExecutable(d3d::Context *context, 198 const uint8_t *function, 199 size_t length, 200 gl::ShaderType type, 201 const std::vector<D3DVarying> &streamOutVaryings, 202 bool separatedOutputBuffers, 203 ShaderExecutableD3D **outExecutable) override; 204 angle::Result compileToExecutable(d3d::Context *context, 205 gl::InfoLog &infoLog, 206 const std::string &shaderHLSL, 207 gl::ShaderType type, 208 const std::vector<D3DVarying> &streamOutVaryings, 209 bool separatedOutputBuffers, 210 const angle::CompilerWorkaroundsD3D &workarounds, 211 ShaderExecutableD3D **outExectuable) override; 212 angle::Result ensureHLSLCompilerInitialized(d3d::Context *context) override; 213 214 UniformStorageD3D *createUniformStorage(size_t storageSize) override; 215 216 // Image operations 217 ImageD3D *createImage() override; 218 ExternalImageSiblingImpl *createExternalImageSibling(const gl::Context *context, 219 EGLenum target, 220 EGLClientBuffer buffer, 221 const egl::AttributeMap &attribs) override; 222 angle::Result generateMipmap(const gl::Context *context, 223 ImageD3D *dest, 224 ImageD3D *source) override; 225 angle::Result generateMipmapUsingD3D(const gl::Context *context, 226 TextureStorage *storage, 227 const gl::TextureState &textureState) override; 228 angle::Result copyImage(const gl::Context *context, 229 ImageD3D *dest, 230 ImageD3D *source, 231 const gl::Box &sourceBox, 232 const gl::Offset &destOffset, 233 bool unpackFlipY, 234 bool unpackPremultiplyAlpha, 235 bool unpackUnmultiplyAlpha) override; 236 237 TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain, 238 const std::string &label) override; 239 TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage, 240 RenderTargetD3D *renderTargetD3D, 241 const std::string &label) override; 242 TextureStorage *createTextureStorageExternal(egl::Stream *stream, 243 const egl::Stream::GLTextureDescription &desc, 244 const std::string &label) override; 245 TextureStorage *createTextureStorage2D(GLenum internalformat, 246 bool renderTarget, 247 GLsizei width, 248 GLsizei height, 249 int levels, 250 const std::string &label, 251 bool hintLevelZeroOnly) override; 252 TextureStorage *createTextureStorageCube(GLenum internalformat, 253 bool renderTarget, 254 int size, 255 int levels, 256 bool hintLevelZeroOnly, 257 const std::string &label) override; 258 TextureStorage *createTextureStorage3D(GLenum internalformat, 259 bool renderTarget, 260 GLsizei width, 261 GLsizei height, 262 GLsizei depth, 263 int levels, 264 const std::string &label) override; 265 TextureStorage *createTextureStorage2DArray(GLenum internalformat, 266 bool renderTarget, 267 GLsizei width, 268 GLsizei height, 269 GLsizei depth, 270 int levels, 271 const std::string &label) override; 272 TextureStorage *createTextureStorage2DMultisample(GLenum internalformat, 273 GLsizei width, 274 GLsizei height, 275 int levels, 276 int samples, 277 bool fixedSampleLocations, 278 const std::string &label) override; 279 TextureStorage *createTextureStorage2DMultisampleArray(GLenum internalformat, 280 GLsizei width, 281 GLsizei height, 282 GLsizei depth, 283 int levels, 284 int samples, 285 bool fixedSampleLocations, 286 const std::string &label) override; 287 288 VertexBuffer *createVertexBuffer() override; 289 IndexBuffer *createIndexBuffer() override; 290 291 // Stream Creation 292 StreamProducerImpl *createStreamProducerD3DTexture(egl::Stream::ConsumerType consumerType, 293 const egl::AttributeMap &attribs) override; 294 295 // D3D11-renderer specific methods getDevice()296 ID3D11Device *getDevice() { return mDevice; } 297 void *getD3DDevice() override; getDeviceContext()298 ID3D11DeviceContext *getDeviceContext() { return mDeviceContext; } getDeviceContext1IfSupported()299 ID3D11DeviceContext1 *getDeviceContext1IfSupported() { return mDeviceContext1; } getDxgiFactory()300 IDXGIFactory *getDxgiFactory() { return mDxgiFactory; } 301 302 angle::Result getBlendState(const gl::Context *context, 303 const d3d11::BlendStateKey &key, 304 const d3d11::BlendState **outBlendState); 305 angle::Result getRasterizerState(const gl::Context *context, 306 const gl::RasterizerState &rasterState, 307 bool scissorEnabled, 308 ID3D11RasterizerState **outRasterizerState); 309 angle::Result getDepthStencilState(const gl::Context *context, 310 const gl::DepthStencilState &dsState, 311 const d3d11::DepthStencilState **outDSState); 312 angle::Result getSamplerState(const gl::Context *context, 313 const gl::SamplerState &samplerState, 314 ID3D11SamplerState **outSamplerState); 315 UINT getSampleDescQuality(GLuint supportedSamples) const; 316 getBlitter()317 Blit11 *getBlitter() { return mBlit; } getClearer()318 Clear11 *getClearer() { return mClear; } 319 gl::DebugAnnotator *getAnnotator(); 320 321 // Buffer-to-texture and Texture-to-buffer copies 322 bool supportsFastCopyBufferToTexture(GLenum internalFormat) const override; 323 angle::Result fastCopyBufferToTexture(const gl::Context *context, 324 const gl::PixelUnpackState &unpack, 325 gl::Buffer *unpackBuffer, 326 unsigned int offset, 327 RenderTargetD3D *destRenderTarget, 328 GLenum destinationFormat, 329 GLenum sourcePixelsType, 330 const gl::Box &destArea) override; 331 332 angle::Result packPixels(const gl::Context *context, 333 const TextureHelper11 &textureHelper, 334 const PackPixelsParams ¶ms, 335 uint8_t *pixelsOut); 336 337 bool getLUID(LUID *adapterLuid) const override; 338 VertexConversionType getVertexConversionType(angle::FormatID vertexFormatID) const override; 339 GLenum getVertexComponentType(angle::FormatID vertexFormatID) const override; 340 341 // Warning: you should ensure binding really matches attrib.bindingIndex before using this 342 // function. 343 angle::Result getVertexSpaceRequired(const gl::Context *context, 344 const gl::VertexAttribute &attrib, 345 const gl::VertexBinding &binding, 346 size_t count, 347 GLsizei instances, 348 GLuint baseInstance, 349 unsigned int *bytesRequiredOut) const override; 350 351 angle::Result readFromAttachment(const gl::Context *context, 352 const gl::FramebufferAttachment &srcAttachment, 353 const gl::Rectangle &sourceArea, 354 GLenum format, 355 GLenum type, 356 GLuint outputPitch, 357 const gl::PixelPackState &pack, 358 uint8_t *pixels); 359 360 angle::Result blitRenderbufferRect(const gl::Context *context, 361 const gl::Rectangle &readRect, 362 const gl::Rectangle &drawRect, 363 RenderTargetD3D *readRenderTarget, 364 RenderTargetD3D *drawRenderTarget, 365 GLenum filter, 366 const gl::Rectangle *scissor, 367 bool colorBlit, 368 bool depthBlit, 369 bool stencilBlit); 370 371 bool isES3Capable() const; getRenderer11DeviceCaps()372 const Renderer11DeviceCaps &getRenderer11DeviceCaps() const { return mRenderer11DeviceCaps; } 373 374 RendererClass getRendererClass() const override; getStateManager()375 StateManager11 *getStateManager() { return &mStateManager; } 376 377 void onSwap(); 378 void onBufferCreate(const Buffer11 *created); 379 void onBufferDelete(const Buffer11 *deleted); 380 381 DeviceImpl *createEGLDevice() override; 382 383 angle::Result drawArrays(const gl::Context *context, 384 gl::PrimitiveMode mode, 385 GLint firstVertex, 386 GLsizei vertexCount, 387 GLsizei instanceCount, 388 GLuint baseInstance, 389 bool isInstancedDraw); 390 angle::Result drawElements(const gl::Context *context, 391 gl::PrimitiveMode mode, 392 GLint startVertex, 393 GLsizei indexCount, 394 gl::DrawElementsType indexType, 395 const void *indices, 396 GLsizei instanceCount, 397 GLint baseVertex, 398 GLuint baseInstance, 399 bool isInstancedDraw); 400 angle::Result drawArraysIndirect(const gl::Context *context, const void *indirect); 401 angle::Result drawElementsIndirect(const gl::Context *context, const void *indirect); 402 403 // Necessary hack for default framebuffers in D3D. 404 FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override; 405 406 angle::Result getScratchMemoryBuffer(Context11 *context11, 407 size_t requestedSize, 408 angle::MemoryBuffer **bufferOut); 409 410 gl::Version getMaxSupportedESVersion() const override; 411 gl::Version getMaxConformantESVersion() const override; 412 413 angle::Result dispatchCompute(const gl::Context *context, 414 GLuint numGroupsX, 415 GLuint numGroupsY, 416 GLuint numGroupsZ); 417 angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect); 418 419 angle::Result createStagingTexture(const gl::Context *context, 420 ResourceType textureType, 421 const d3d11::Format &formatSet, 422 const gl::Extents &size, 423 StagingAccess readAndWriteAccess, 424 TextureHelper11 *textureOut); 425 426 template <typename DescT, typename ResourceT> allocateResource(d3d::Context * context,const DescT & desc,ResourceT * resourceOut)427 angle::Result allocateResource(d3d::Context *context, const DescT &desc, ResourceT *resourceOut) 428 { 429 return mResourceManager11.allocate(context, this, &desc, nullptr, resourceOut); 430 } 431 432 template <typename DescT, typename InitDataT, typename ResourceT> allocateResource(d3d::Context * context,const DescT & desc,InitDataT * initData,ResourceT * resourceOut)433 angle::Result allocateResource(d3d::Context *context, 434 const DescT &desc, 435 InitDataT *initData, 436 ResourceT *resourceOut) 437 { 438 return mResourceManager11.allocate(context, this, &desc, initData, resourceOut); 439 } 440 441 template <typename InitDataT, typename ResourceT> allocateResourceNoDesc(d3d::Context * context,InitDataT * initData,ResourceT * resourceOut)442 angle::Result allocateResourceNoDesc(d3d::Context *context, 443 InitDataT *initData, 444 ResourceT *resourceOut) 445 { 446 return mResourceManager11.allocate(context, this, nullptr, initData, resourceOut); 447 } 448 449 template <typename DescT> allocateTexture(d3d::Context * context,const DescT & desc,const d3d11::Format & format,TextureHelper11 * textureOut)450 angle::Result allocateTexture(d3d::Context *context, 451 const DescT &desc, 452 const d3d11::Format &format, 453 TextureHelper11 *textureOut) 454 { 455 return allocateTexture(context, desc, format, nullptr, textureOut); 456 } 457 458 angle::Result allocateTexture(d3d::Context *context, 459 const D3D11_TEXTURE2D_DESC &desc, 460 const d3d11::Format &format, 461 const D3D11_SUBRESOURCE_DATA *initData, 462 TextureHelper11 *textureOut); 463 464 angle::Result allocateTexture(d3d::Context *context, 465 const D3D11_TEXTURE3D_DESC &desc, 466 const d3d11::Format &format, 467 const D3D11_SUBRESOURCE_DATA *initData, 468 TextureHelper11 *textureOut); 469 470 angle::Result clearRenderTarget(const gl::Context *context, 471 RenderTargetD3D *renderTarget, 472 const gl::ColorF &clearColorValue, 473 const float clearDepthValue, 474 const unsigned int clearStencilValue) override; 475 476 bool canSelectViewInVertexShader() const override; 477 478 angle::Result mapResource(const gl::Context *context, 479 ID3D11Resource *resource, 480 UINT subResource, 481 D3D11_MAP mapType, 482 UINT mapFlags, 483 D3D11_MAPPED_SUBRESOURCE *mappedResource); 484 485 angle::Result getIncompleteTexture(const gl::Context *context, 486 gl::TextureType type, 487 gl::Texture **textureOut) override; 488 489 void setGlobalDebugAnnotator() override; 490 491 std::string getRendererDescription() const override; 492 std::string getVendorString() const override; 493 std::string getVersionString() const override; 494 495 private: 496 void generateCaps(gl::Caps *outCaps, 497 gl::TextureCapsMap *outTextureCaps, 498 gl::Extensions *outExtensions, 499 gl::Limitations *outLimitations) const override; 500 501 void initializeFeatures(angle::FeaturesD3D *features) const override; 502 503 angle::Result drawLineLoop(const gl::Context *context, 504 GLuint count, 505 gl::DrawElementsType type, 506 const void *indices, 507 int baseVertex, 508 int instances); 509 angle::Result drawTriangleFan(const gl::Context *context, 510 GLuint count, 511 gl::DrawElementsType type, 512 const void *indices, 513 int baseVertex, 514 int instances); 515 516 angle::Result resolveMultisampledTexture(const gl::Context *context, 517 RenderTarget11 *renderTarget, 518 bool depth, 519 bool stencil, 520 TextureHelper11 *textureOut); 521 522 void populateRenderer11DeviceCaps(); 523 524 void updateHistograms(); 525 526 angle::Result copyImageInternal(const gl::Context *context, 527 const gl::Framebuffer *framebuffer, 528 const gl::Rectangle &sourceRect, 529 GLenum destFormat, 530 const gl::Offset &destOffset, 531 RenderTargetD3D *destRenderTarget); 532 533 gl::SupportedSampleSet generateSampleSetForEGLConfig( 534 const gl::TextureCaps &colorBufferFormatCaps, 535 const gl::TextureCaps &depthStencilBufferFormatCaps) const; 536 537 HRESULT callD3D11CreateDevice(PFN_D3D11_CREATE_DEVICE createDevice, bool debug); 538 HRESULT callD3D11On12CreateDevice(PFN_D3D12_CREATE_DEVICE createDevice12, 539 PFN_D3D11ON12_CREATE_DEVICE createDevice11on12, 540 bool debug); 541 egl::Error initializeD3DDevice(); 542 egl::Error initializeDevice(); 543 void releaseDeviceResources(); 544 void release(); 545 546 d3d11::ANGLED3D11DeviceType getDeviceType() const; 547 548 // Make sure that the raw buffer is the latest buffer. 549 angle::Result markRawBufferUsage(const gl::Context *context); 550 angle::Result markTransformFeedbackUsage(const gl::Context *context); 551 angle::Result drawWithGeometryShaderAndTransformFeedback(Context11 *context11, 552 gl::PrimitiveMode mode, 553 UINT instanceCount, 554 UINT vertexCount); 555 556 HMODULE mD3d11Module; 557 HMODULE mD3d12Module; 558 HMODULE mDxgiModule; 559 HMODULE mDCompModule; 560 std::vector<D3D_FEATURE_LEVEL> mAvailableFeatureLevels; 561 D3D_DRIVER_TYPE mRequestedDriverType; 562 bool mCreateDebugDevice; 563 bool mCreatedWithDeviceEXT; 564 565 HLSLCompiler mCompiler; 566 567 RenderStateCache mStateCache; 568 569 StateManager11 mStateManager; 570 571 StreamingIndexBufferInterface *mLineLoopIB; 572 StreamingIndexBufferInterface *mTriangleFanIB; 573 574 // Texture copy resources 575 Blit11 *mBlit; 576 PixelTransfer11 *mPixelTransfer; 577 578 // Masked clear resources 579 Clear11 *mClear; 580 581 // Perform trim for D3D resources 582 Trim11 *mTrim; 583 584 // Sync query 585 d3d11::Query mSyncQuery; 586 587 // Created objects state tracking 588 std::set<const Buffer11 *> mAliveBuffers; 589 590 double mLastHistogramUpdateTime; 591 592 angle::ComPtr<ID3D12Device> mDevice12; 593 angle::ComPtr<ID3D12CommandQueue> mCommandQueue; 594 595 ID3D11Device *mDevice; 596 Renderer11DeviceCaps mRenderer11DeviceCaps; 597 ID3D11DeviceContext *mDeviceContext; 598 ID3D11DeviceContext1 *mDeviceContext1; 599 ID3D11DeviceContext3 *mDeviceContext3; 600 IDXGIAdapter *mDxgiAdapter; 601 DXGI_ADAPTER_DESC mAdapterDescription; 602 char mDescription[128]; 603 IDXGIFactory *mDxgiFactory; 604 ID3D11Debug *mDebug; 605 606 std::vector<GLuint> mScratchIndexDataBuffer; 607 608 angle::ScratchBuffer mScratchMemoryBuffer; 609 610 DebugAnnotator11 mAnnotator; 611 612 mutable Optional<bool> mSupportsShareHandles; 613 ResourceManager11 mResourceManager11; 614 615 TextureHelper11 mCachedResolveTexture; 616 }; 617 618 } // namespace rx 619 #endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_ 620