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 &params,
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     angle::Result drawElements(const gl::Context *context,
390                                gl::PrimitiveMode mode,
391                                GLint startVertex,
392                                GLsizei indexCount,
393                                gl::DrawElementsType indexType,
394                                const void *indices,
395                                GLsizei instanceCount,
396                                GLint baseVertex,
397                                GLuint baseInstance);
398     angle::Result drawArraysIndirect(const gl::Context *context, const void *indirect);
399     angle::Result drawElementsIndirect(const gl::Context *context, const void *indirect);
400 
401     // Necessary hack for default framebuffers in D3D.
402     FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
403 
404     angle::Result getScratchMemoryBuffer(Context11 *context11,
405                                          size_t requestedSize,
406                                          angle::MemoryBuffer **bufferOut);
407 
408     gl::Version getMaxSupportedESVersion() const override;
409     gl::Version getMaxConformantESVersion() const override;
410 
411     angle::Result dispatchCompute(const gl::Context *context,
412                                   GLuint numGroupsX,
413                                   GLuint numGroupsY,
414                                   GLuint numGroupsZ);
415     angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect);
416 
417     angle::Result createStagingTexture(const gl::Context *context,
418                                        ResourceType textureType,
419                                        const d3d11::Format &formatSet,
420                                        const gl::Extents &size,
421                                        StagingAccess readAndWriteAccess,
422                                        TextureHelper11 *textureOut);
423 
424     template <typename DescT, typename ResourceT>
allocateResource(d3d::Context * context,const DescT & desc,ResourceT * resourceOut)425     angle::Result allocateResource(d3d::Context *context, const DescT &desc, ResourceT *resourceOut)
426     {
427         return mResourceManager11.allocate(context, this, &desc, nullptr, resourceOut);
428     }
429 
430     template <typename DescT, typename InitDataT, typename ResourceT>
allocateResource(d3d::Context * context,const DescT & desc,InitDataT * initData,ResourceT * resourceOut)431     angle::Result allocateResource(d3d::Context *context,
432                                    const DescT &desc,
433                                    InitDataT *initData,
434                                    ResourceT *resourceOut)
435     {
436         return mResourceManager11.allocate(context, this, &desc, initData, resourceOut);
437     }
438 
439     template <typename InitDataT, typename ResourceT>
allocateResourceNoDesc(d3d::Context * context,InitDataT * initData,ResourceT * resourceOut)440     angle::Result allocateResourceNoDesc(d3d::Context *context,
441                                          InitDataT *initData,
442                                          ResourceT *resourceOut)
443     {
444         return mResourceManager11.allocate(context, this, nullptr, initData, resourceOut);
445     }
446 
447     template <typename DescT>
allocateTexture(d3d::Context * context,const DescT & desc,const d3d11::Format & format,TextureHelper11 * textureOut)448     angle::Result allocateTexture(d3d::Context *context,
449                                   const DescT &desc,
450                                   const d3d11::Format &format,
451                                   TextureHelper11 *textureOut)
452     {
453         return allocateTexture(context, desc, format, nullptr, textureOut);
454     }
455 
456     angle::Result allocateTexture(d3d::Context *context,
457                                   const D3D11_TEXTURE2D_DESC &desc,
458                                   const d3d11::Format &format,
459                                   const D3D11_SUBRESOURCE_DATA *initData,
460                                   TextureHelper11 *textureOut);
461 
462     angle::Result allocateTexture(d3d::Context *context,
463                                   const D3D11_TEXTURE3D_DESC &desc,
464                                   const d3d11::Format &format,
465                                   const D3D11_SUBRESOURCE_DATA *initData,
466                                   TextureHelper11 *textureOut);
467 
468     angle::Result clearRenderTarget(const gl::Context *context,
469                                     RenderTargetD3D *renderTarget,
470                                     const gl::ColorF &clearColorValue,
471                                     const float clearDepthValue,
472                                     const unsigned int clearStencilValue) override;
473 
474     bool canSelectViewInVertexShader() const override;
475 
476     angle::Result mapResource(const gl::Context *context,
477                               ID3D11Resource *resource,
478                               UINT subResource,
479                               D3D11_MAP mapType,
480                               UINT mapFlags,
481                               D3D11_MAPPED_SUBRESOURCE *mappedResource);
482 
483     angle::Result getIncompleteTexture(const gl::Context *context,
484                                        gl::TextureType type,
485                                        gl::Texture **textureOut) override;
486 
487     void setGlobalDebugAnnotator() override;
488 
489     std::string getRendererDescription() const override;
490     std::string getVendorString() const override;
491     std::string getVersionString() const override;
492 
493   private:
494     void generateCaps(gl::Caps *outCaps,
495                       gl::TextureCapsMap *outTextureCaps,
496                       gl::Extensions *outExtensions,
497                       gl::Limitations *outLimitations) const override;
498 
499     void initializeFeatures(angle::FeaturesD3D *features) const override;
500 
501     angle::Result drawLineLoop(const gl::Context *context,
502                                GLuint count,
503                                gl::DrawElementsType type,
504                                const void *indices,
505                                int baseVertex,
506                                int instances);
507     angle::Result drawTriangleFan(const gl::Context *context,
508                                   GLuint count,
509                                   gl::DrawElementsType type,
510                                   const void *indices,
511                                   int baseVertex,
512                                   int instances);
513 
514     angle::Result resolveMultisampledTexture(const gl::Context *context,
515                                              RenderTarget11 *renderTarget,
516                                              bool depth,
517                                              bool stencil,
518                                              TextureHelper11 *textureOut);
519 
520     void populateRenderer11DeviceCaps();
521 
522     void updateHistograms();
523 
524     angle::Result copyImageInternal(const gl::Context *context,
525                                     const gl::Framebuffer *framebuffer,
526                                     const gl::Rectangle &sourceRect,
527                                     GLenum destFormat,
528                                     const gl::Offset &destOffset,
529                                     RenderTargetD3D *destRenderTarget);
530 
531     gl::SupportedSampleSet generateSampleSetForEGLConfig(
532         const gl::TextureCaps &colorBufferFormatCaps,
533         const gl::TextureCaps &depthStencilBufferFormatCaps) const;
534 
535     HRESULT callD3D11CreateDevice(PFN_D3D11_CREATE_DEVICE createDevice, bool debug);
536     HRESULT callD3D11On12CreateDevice(PFN_D3D12_CREATE_DEVICE createDevice12,
537                                       PFN_D3D11ON12_CREATE_DEVICE createDevice11on12,
538                                       bool debug);
539     egl::Error initializeD3DDevice();
540     egl::Error initializeDevice();
541     void releaseDeviceResources();
542     void release();
543 
544     d3d11::ANGLED3D11DeviceType getDeviceType() const;
545 
546     // Make sure that the raw buffer is the latest buffer.
547     angle::Result markRawBufferUsage(const gl::Context *context);
548     angle::Result markTransformFeedbackUsage(const gl::Context *context);
549     angle::Result drawWithGeometryShaderAndTransformFeedback(Context11 *context11,
550                                                              gl::PrimitiveMode mode,
551                                                              UINT instanceCount,
552                                                              UINT vertexCount);
553 
554     HMODULE mD3d11Module;
555     HMODULE mD3d12Module;
556     HMODULE mDxgiModule;
557     HMODULE mDCompModule;
558     std::vector<D3D_FEATURE_LEVEL> mAvailableFeatureLevels;
559     D3D_DRIVER_TYPE mRequestedDriverType;
560     bool mCreateDebugDevice;
561     bool mCreatedWithDeviceEXT;
562 
563     HLSLCompiler mCompiler;
564 
565     RenderStateCache mStateCache;
566 
567     StateManager11 mStateManager;
568 
569     StreamingIndexBufferInterface *mLineLoopIB;
570     StreamingIndexBufferInterface *mTriangleFanIB;
571 
572     // Texture copy resources
573     Blit11 *mBlit;
574     PixelTransfer11 *mPixelTransfer;
575 
576     // Masked clear resources
577     Clear11 *mClear;
578 
579     // Perform trim for D3D resources
580     Trim11 *mTrim;
581 
582     // Sync query
583     d3d11::Query mSyncQuery;
584 
585     // Created objects state tracking
586     std::set<const Buffer11 *> mAliveBuffers;
587 
588     double mLastHistogramUpdateTime;
589 
590     angle::ComPtr<ID3D12Device> mDevice12;
591     angle::ComPtr<ID3D12CommandQueue> mCommandQueue;
592 
593     ID3D11Device *mDevice;
594     Renderer11DeviceCaps mRenderer11DeviceCaps;
595     ID3D11DeviceContext *mDeviceContext;
596     ID3D11DeviceContext1 *mDeviceContext1;
597     ID3D11DeviceContext3 *mDeviceContext3;
598     IDXGIAdapter *mDxgiAdapter;
599     DXGI_ADAPTER_DESC mAdapterDescription;
600     char mDescription[128];
601     IDXGIFactory *mDxgiFactory;
602     ID3D11Debug *mDebug;
603 
604     std::vector<GLuint> mScratchIndexDataBuffer;
605 
606     angle::ScratchBuffer mScratchMemoryBuffer;
607 
608     DebugAnnotator11 mAnnotator;
609 
610     mutable Optional<bool> mSupportsShareHandles;
611     ResourceManager11 mResourceManager11;
612 
613     TextureHelper11 mCachedResolveTexture;
614 };
615 
616 }  // namespace rx
617 #endif  // LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_
618