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