tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Renderer11.h (30761B)


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