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