tor-browser

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

Renderer9.h (26582B)


      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 // Renderer9.h: Defines a back-end specific class for the D3D9 renderer.
      8 
      9 #ifndef LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_
     10 #define LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_
     11 
     12 #include "common/angleutils.h"
     13 #include "common/mathutil.h"
     14 #include "libANGLE/renderer/d3d/HLSLCompiler.h"
     15 #include "libANGLE/renderer/d3d/RenderTargetD3D.h"
     16 #include "libANGLE/renderer/d3d/RendererD3D.h"
     17 #include "libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h"
     18 #include "libANGLE/renderer/d3d/d3d9/ShaderCache.h"
     19 #include "libANGLE/renderer/d3d/d3d9/StateManager9.h"
     20 #include "libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h"
     21 #include "libANGLE/renderer/driver_utils.h"
     22 
     23 namespace gl
     24 {
     25 class FramebufferAttachment;
     26 }
     27 
     28 namespace egl
     29 {
     30 class AttributeMap;
     31 }
     32 
     33 namespace rx
     34 {
     35 class Blit9;
     36 class Context9;
     37 class IndexDataManager;
     38 class ProgramD3D;
     39 class RenderTarget9;
     40 class StreamingIndexBufferInterface;
     41 class StaticIndexBufferInterface;
     42 class VertexDataManager;
     43 struct ClearParameters;
     44 struct D3DUniform;
     45 struct TranslatedAttribute;
     46 
     47 class Renderer9 : public RendererD3D
     48 {
     49  public:
     50    explicit Renderer9(egl::Display *display);
     51    ~Renderer9() override;
     52 
     53    egl::Error initialize() override;
     54    bool resetDevice() override;
     55 
     56    egl::ConfigSet generateConfigs() override;
     57    void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const override;
     58 
     59    void startScene();
     60    void endScene();
     61 
     62    angle::Result flush(const gl::Context *context);
     63    angle::Result finish(const gl::Context *context);
     64 
     65    bool isValidNativeWindow(EGLNativeWindowType window) const override;
     66    NativeWindowD3D *createNativeWindow(EGLNativeWindowType window,
     67                                        const egl::Config *config,
     68                                        const egl::AttributeMap &attribs) const override;
     69 
     70    SwapChainD3D *createSwapChain(NativeWindowD3D *nativeWindow,
     71                                  HANDLE shareHandle,
     72                                  IUnknown *d3dTexture,
     73                                  GLenum backBufferFormat,
     74                                  GLenum depthBufferFormat,
     75                                  EGLint orientation,
     76                                  EGLint samples) override;
     77    egl::Error getD3DTextureInfo(const egl::Config *configuration,
     78                                 IUnknown *d3dTexture,
     79                                 const egl::AttributeMap &attribs,
     80                                 EGLint *width,
     81                                 EGLint *height,
     82                                 GLsizei *samples,
     83                                 gl::Format *glFormat,
     84                                 const angle::Format **angleFormat,
     85                                 UINT *arraySlice) const override;
     86    egl::Error validateShareHandle(const egl::Config *config,
     87                                   HANDLE shareHandle,
     88                                   const egl::AttributeMap &attribs) const override;
     89 
     90    ContextImpl *createContext(const gl::State &state, gl::ErrorSet *errorSet) override;
     91 
     92    angle::Result allocateEventQuery(const gl::Context *context, IDirect3DQuery9 **outQuery);
     93    void freeEventQuery(IDirect3DQuery9 *query);
     94 
     95    // resource creation
     96    angle::Result createVertexShader(d3d::Context *context,
     97                                     const DWORD *function,
     98                                     size_t length,
     99                                     IDirect3DVertexShader9 **outShader);
    100    angle::Result createPixelShader(d3d::Context *context,
    101                                    const DWORD *function,
    102                                    size_t length,
    103                                    IDirect3DPixelShader9 **outShader);
    104    HRESULT createVertexBuffer(UINT Length, DWORD Usage, IDirect3DVertexBuffer9 **ppVertexBuffer);
    105    HRESULT createIndexBuffer(UINT Length,
    106                              DWORD Usage,
    107                              D3DFORMAT Format,
    108                              IDirect3DIndexBuffer9 **ppIndexBuffer);
    109    angle::Result setSamplerState(const gl::Context *context,
    110                                  gl::ShaderType type,
    111                                  int index,
    112                                  gl::Texture *texture,
    113                                  const gl::SamplerState &sampler);
    114    angle::Result setTexture(const gl::Context *context,
    115                             gl::ShaderType type,
    116                             int index,
    117                             gl::Texture *texture);
    118 
    119    angle::Result updateState(const gl::Context *context, gl::PrimitiveMode drawMode);
    120 
    121    void setScissorRectangle(const gl::Rectangle &scissor, bool enabled);
    122    void setViewport(const gl::Rectangle &viewport,
    123                     float zNear,
    124                     float zFar,
    125                     gl::PrimitiveMode drawMode,
    126                     GLenum frontFace,
    127                     bool ignoreViewport);
    128 
    129    angle::Result applyRenderTarget(const gl::Context *context,
    130                                    const RenderTarget9 *colorRenderTarget,
    131                                    const RenderTarget9 *depthStencilRenderTarget);
    132    void applyUniforms(ProgramD3D *programD3D);
    133    bool applyPrimitiveType(gl::PrimitiveMode primitiveType,
    134                            GLsizei elementCount,
    135                            bool usesPointSize);
    136    angle::Result applyVertexBuffer(const gl::Context *context,
    137                                    gl::PrimitiveMode mode,
    138                                    GLint first,
    139                                    GLsizei count,
    140                                    GLsizei instances,
    141                                    TranslatedIndexData *indexInfo);
    142    angle::Result applyIndexBuffer(const gl::Context *context,
    143                                   const void *indices,
    144                                   GLsizei count,
    145                                   gl::PrimitiveMode mode,
    146                                   gl::DrawElementsType type,
    147                                   TranslatedIndexData *indexInfo);
    148 
    149    void clear(const ClearParameters &clearParams,
    150               const RenderTarget9 *colorRenderTarget,
    151               const RenderTarget9 *depthStencilRenderTarget);
    152 
    153    void markAllStateDirty();
    154 
    155    // lost device
    156    bool testDeviceLost() override;
    157    bool testDeviceResettable() override;
    158 
    159    VendorID getVendorId() const;
    160    DeviceIdentifier getAdapterIdentifier() const override;
    161 
    162    IDirect3DDevice9 *getDevice() { return mDevice; }
    163    void *getD3DDevice() override;
    164 
    165    unsigned int getReservedVertexUniformVectors() const;
    166    unsigned int getReservedFragmentUniformVectors() const;
    167 
    168    bool getShareHandleSupport() const;
    169 
    170    int getMajorShaderModel() const override;
    171    int getMinorShaderModel() const override;
    172    std::string getShaderModelSuffix() const override;
    173 
    174    DWORD getCapsDeclTypes() const;
    175 
    176    // Pixel operations
    177    angle::Result copyImage2D(const gl::Context *context,
    178                              const gl::Framebuffer *framebuffer,
    179                              const gl::Rectangle &sourceRect,
    180                              GLenum destFormat,
    181                              const gl::Offset &destOffset,
    182                              TextureStorage *storage,
    183                              GLint level) override;
    184    angle::Result copyImageCube(const gl::Context *context,
    185                                const gl::Framebuffer *framebuffer,
    186                                const gl::Rectangle &sourceRect,
    187                                GLenum destFormat,
    188                                const gl::Offset &destOffset,
    189                                TextureStorage *storage,
    190                                gl::TextureTarget target,
    191                                GLint level) override;
    192    angle::Result copyImage3D(const gl::Context *context,
    193                              const gl::Framebuffer *framebuffer,
    194                              const gl::Rectangle &sourceRect,
    195                              GLenum destFormat,
    196                              const gl::Offset &destOffset,
    197                              TextureStorage *storage,
    198                              GLint level) override;
    199    angle::Result copyImage2DArray(const gl::Context *context,
    200                                   const gl::Framebuffer *framebuffer,
    201                                   const gl::Rectangle &sourceRect,
    202                                   GLenum destFormat,
    203                                   const gl::Offset &destOffset,
    204                                   TextureStorage *storage,
    205                                   GLint level) override;
    206 
    207    angle::Result copyTexture(const gl::Context *context,
    208                              const gl::Texture *source,
    209                              GLint sourceLevel,
    210                              gl::TextureTarget srcTarget,
    211                              const gl::Box &sourceBox,
    212                              GLenum destFormat,
    213                              GLenum destType,
    214                              const gl::Offset &destOffset,
    215                              TextureStorage *storage,
    216                              gl::TextureTarget destTarget,
    217                              GLint destLevel,
    218                              bool unpackFlipY,
    219                              bool unpackPremultiplyAlpha,
    220                              bool unpackUnmultiplyAlpha) override;
    221    angle::Result copyCompressedTexture(const gl::Context *context,
    222                                        const gl::Texture *source,
    223                                        GLint sourceLevel,
    224                                        TextureStorage *storage,
    225                                        GLint destLevel) override;
    226 
    227    // RenderTarget creation
    228    angle::Result createRenderTarget(const gl::Context *context,
    229                                     int width,
    230                                     int height,
    231                                     GLenum format,
    232                                     GLsizei samples,
    233                                     RenderTargetD3D **outRT) override;
    234    angle::Result createRenderTargetCopy(const gl::Context *context,
    235                                         RenderTargetD3D *source,
    236                                         RenderTargetD3D **outRT) override;
    237 
    238    // Shader operations
    239    angle::Result loadExecutable(d3d::Context *context,
    240                                 const uint8_t *function,
    241                                 size_t length,
    242                                 gl::ShaderType type,
    243                                 const std::vector<D3DVarying> &streamOutVaryings,
    244                                 bool separatedOutputBuffers,
    245                                 ShaderExecutableD3D **outExecutable) override;
    246    angle::Result compileToExecutable(d3d::Context *context,
    247                                      gl::InfoLog &infoLog,
    248                                      const std::string &shaderHLSL,
    249                                      gl::ShaderType type,
    250                                      const std::vector<D3DVarying> &streamOutVaryings,
    251                                      bool separatedOutputBuffers,
    252                                      const CompilerWorkaroundsD3D &workarounds,
    253                                      ShaderExecutableD3D **outExectuable) override;
    254    angle::Result ensureHLSLCompilerInitialized(d3d::Context *context) override;
    255 
    256    UniformStorageD3D *createUniformStorage(size_t storageSize) override;
    257 
    258    // Image operations
    259    ImageD3D *createImage() override;
    260    ExternalImageSiblingImpl *createExternalImageSibling(const gl::Context *context,
    261                                                         EGLenum target,
    262                                                         EGLClientBuffer buffer,
    263                                                         const egl::AttributeMap &attribs) override;
    264    angle::Result generateMipmap(const gl::Context *context,
    265                                 ImageD3D *dest,
    266                                 ImageD3D *source) override;
    267    angle::Result generateMipmapUsingD3D(const gl::Context *context,
    268                                         TextureStorage *storage,
    269                                         const gl::TextureState &textureState) override;
    270    angle::Result copyImage(const gl::Context *context,
    271                            ImageD3D *dest,
    272                            ImageD3D *source,
    273                            const gl::Box &sourceBox,
    274                            const gl::Offset &destOffset,
    275                            bool unpackFlipY,
    276                            bool unpackPremultiplyAlpha,
    277                            bool unpackUnmultiplyAlpha) override;
    278    TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain,
    279                                           const std::string &label) override;
    280    TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage,
    281                                                 RenderTargetD3D *renderTargetD3D,
    282                                                 const std::string &label) override;
    283 
    284    TextureStorage *createTextureStorageBuffer(const gl::OffsetBindingPointer<gl::Buffer> &buffer,
    285                                               GLenum internalFormat,
    286                                               const std::string &label) override;
    287 
    288    TextureStorage *createTextureStorageExternal(egl::Stream *stream,
    289                                                 const egl::Stream::GLTextureDescription &desc,
    290                                                 const std::string &label) override;
    291 
    292    TextureStorage *createTextureStorage2D(GLenum internalformat,
    293                                           BindFlags bindFlags,
    294                                           GLsizei width,
    295                                           GLsizei height,
    296                                           int levels,
    297                                           const std::string &label,
    298                                           bool hintLevelZeroOnly) override;
    299    TextureStorage *createTextureStorageCube(GLenum internalformat,
    300                                             BindFlags bindFlags,
    301                                             int size,
    302                                             int levels,
    303                                             bool hintLevelZeroOnly,
    304                                             const std::string &label) override;
    305    TextureStorage *createTextureStorage3D(GLenum internalformat,
    306                                           BindFlags bindFlags,
    307                                           GLsizei width,
    308                                           GLsizei height,
    309                                           GLsizei depth,
    310                                           int levels,
    311                                           const std::string &label) override;
    312    TextureStorage *createTextureStorage2DArray(GLenum internalformat,
    313                                                BindFlags bindFlags,
    314                                                GLsizei width,
    315                                                GLsizei height,
    316                                                GLsizei depth,
    317                                                int levels,
    318                                                const std::string &label) override;
    319 
    320    TextureStorage *createTextureStorage2DMultisample(GLenum internalformat,
    321                                                      GLsizei width,
    322                                                      GLsizei height,
    323                                                      int levels,
    324                                                      int samples,
    325                                                      bool fixedSampleLocations,
    326                                                      const std::string &label) override;
    327    TextureStorage *createTextureStorage2DMultisampleArray(GLenum internalformat,
    328                                                           GLsizei width,
    329                                                           GLsizei height,
    330                                                           GLsizei depth,
    331                                                           int levels,
    332                                                           int samples,
    333                                                           bool fixedSampleLocations,
    334                                                           const std::string &label) override;
    335 
    336    // Buffer creation
    337    VertexBuffer *createVertexBuffer() override;
    338    IndexBuffer *createIndexBuffer() override;
    339 
    340    // Stream Creation
    341    StreamProducerImpl *createStreamProducerD3DTexture(egl::Stream::ConsumerType consumerType,
    342                                                       const egl::AttributeMap &attribs) override;
    343 
    344    // Buffer-to-texture and Texture-to-buffer copies
    345    bool supportsFastCopyBufferToTexture(GLenum internalFormat) const override;
    346    angle::Result fastCopyBufferToTexture(const gl::Context *context,
    347                                          const gl::PixelUnpackState &unpack,
    348                                          gl::Buffer *unpackBuffer,
    349                                          unsigned int offset,
    350                                          RenderTargetD3D *destRenderTarget,
    351                                          GLenum destinationFormat,
    352                                          GLenum sourcePixelsType,
    353                                          const gl::Box &destArea) override;
    354 
    355    // D3D9-renderer specific methods
    356    angle::Result boxFilter(Context9 *context9, IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
    357 
    358    D3DPOOL getTexturePool(DWORD usage) const;
    359 
    360    bool getLUID(LUID *adapterLuid) const override;
    361    VertexConversionType getVertexConversionType(angle::FormatID vertexFormatID) const override;
    362    GLenum getVertexComponentType(angle::FormatID vertexFormatID) const override;
    363 
    364    // Warning: you should ensure binding really matches attrib.bindingIndex before using this
    365    // function.
    366    angle::Result getVertexSpaceRequired(const gl::Context *context,
    367                                         const gl::VertexAttribute &attrib,
    368                                         const gl::VertexBinding &binding,
    369                                         size_t count,
    370                                         GLsizei instances,
    371                                         GLuint baseInstance,
    372                                         unsigned int *bytesRequiredOut) const override;
    373 
    374    angle::Result copyToRenderTarget(const gl::Context *context,
    375                                     IDirect3DSurface9 *dest,
    376                                     IDirect3DSurface9 *source,
    377                                     bool fromManaged);
    378 
    379    RendererClass getRendererClass() const override;
    380 
    381    D3DDEVTYPE getD3D9DeviceType() const { return mDeviceType; }
    382 
    383    DeviceImpl *createEGLDevice() override;
    384 
    385    StateManager9 *getStateManager() { return &mStateManager; }
    386 
    387    angle::Result genericDrawArrays(const gl::Context *context,
    388                                    gl::PrimitiveMode mode,
    389                                    GLint first,
    390                                    GLsizei count,
    391                                    GLsizei instances);
    392 
    393    angle::Result genericDrawElements(const gl::Context *context,
    394                                      gl::PrimitiveMode mode,
    395                                      GLsizei count,
    396                                      gl::DrawElementsType type,
    397                                      const void *indices,
    398                                      GLsizei instances);
    399 
    400    // Necessary hack for default framebuffers in D3D.
    401    FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
    402 
    403    DebugAnnotator9 *getAnnotator() { return &mAnnotator; }
    404 
    405    gl::Version getMaxSupportedESVersion() const override;
    406    gl::Version getMaxConformantESVersion() const override;
    407 
    408    angle::Result clearRenderTarget(const gl::Context *context,
    409                                    RenderTargetD3D *renderTarget,
    410                                    const gl::ColorF &clearColorValue,
    411                                    const float clearDepthValue,
    412                                    const unsigned int clearStencilValue) override;
    413 
    414    bool canSelectViewInVertexShader() const override;
    415 
    416    angle::Result getIncompleteTexture(const gl::Context *context,
    417                                       gl::TextureType type,
    418                                       gl::Texture **textureOut) override;
    419 
    420    angle::Result ensureVertexDataManagerInitialized(const gl::Context *context);
    421 
    422    void setGlobalDebugAnnotator() override;
    423 
    424    std::string getRendererDescription() const override;
    425    std::string getVendorString() const override;
    426    std::string getVersionString(bool includeFullVersion) const override;
    427 
    428  private:
    429    angle::Result drawArraysImpl(const gl::Context *context,
    430                                 gl::PrimitiveMode mode,
    431                                 GLint startVertex,
    432                                 GLsizei count,
    433                                 GLsizei instances);
    434    angle::Result drawElementsImpl(const gl::Context *context,
    435                                   gl::PrimitiveMode mode,
    436                                   GLsizei count,
    437                                   gl::DrawElementsType type,
    438                                   const void *indices,
    439                                   GLsizei instances);
    440 
    441    angle::Result applyShaders(const gl::Context *context, gl::PrimitiveMode drawMode);
    442 
    443    angle::Result applyTextures(const gl::Context *context);
    444    angle::Result applyTextures(const gl::Context *context, gl::ShaderType shaderType);
    445 
    446    void generateCaps(gl::Caps *outCaps,
    447                      gl::TextureCapsMap *outTextureCaps,
    448                      gl::Extensions *outExtensions,
    449                      gl::Limitations *outLimitations) const override;
    450 
    451    void initializeFeatures(angle::FeaturesD3D *features) const override;
    452 
    453    void initializeFrontendFeatures(angle::FrontendFeatures *features) const override;
    454 
    455    angle::Result setBlendDepthRasterStates(const gl::Context *context, gl::PrimitiveMode drawMode);
    456 
    457    void release();
    458 
    459    void applyUniformnfv(const D3DUniform *targetUniform, const GLfloat *v);
    460    void applyUniformniv(const D3DUniform *targetUniform, const GLint *v);
    461    void applyUniformnbv(const D3DUniform *targetUniform, const GLint *v);
    462 
    463    angle::Result drawLineLoop(const gl::Context *context,
    464                               GLsizei count,
    465                               gl::DrawElementsType type,
    466                               const void *indices,
    467                               int minIndex,
    468                               gl::Buffer *elementArrayBuffer);
    469    angle::Result drawIndexedPoints(const gl::Context *context,
    470                                    GLsizei count,
    471                                    gl::DrawElementsType type,
    472                                    const void *indices,
    473                                    int minIndex,
    474                                    gl::Buffer *elementArrayBuffer);
    475 
    476    angle::Result getCountingIB(const gl::Context *context,
    477                                size_t count,
    478                                StaticIndexBufferInterface **outIB);
    479 
    480    angle::Result getNullColorRenderTarget(const gl::Context *context,
    481                                           const RenderTarget9 *depthRenderTarget,
    482                                           const RenderTarget9 **outColorRenderTarget);
    483 
    484    D3DPOOL getBufferPool(DWORD usage) const;
    485 
    486    HMODULE mD3d9Module;
    487 
    488    egl::Error initializeDevice();
    489    D3DPRESENT_PARAMETERS getDefaultPresentParameters();
    490    void releaseDeviceResources();
    491 
    492    HRESULT getDeviceStatusCode();
    493    bool isRemovedDeviceResettable() const;
    494    bool resetRemovedDevice();
    495 
    496    UINT mAdapter;
    497    D3DDEVTYPE mDeviceType;
    498    IDirect3D9 *mD3d9;      // Always valid after successful initialization.
    499    IDirect3D9Ex *mD3d9Ex;  // Might be null if D3D9Ex is not supported.
    500    IDirect3DDevice9 *mDevice;
    501    IDirect3DDevice9Ex *mDeviceEx;  // Might be null if D3D9Ex is not supported.
    502 
    503    HLSLCompiler mCompiler;
    504 
    505    Blit9 *mBlit;
    506 
    507    HWND mDeviceWindow;
    508 
    509    D3DCAPS9 mDeviceCaps;
    510    D3DADAPTER_IDENTIFIER9 mAdapterIdentifier;
    511 
    512    D3DPRIMITIVETYPE mPrimitiveType;
    513    int mPrimitiveCount;
    514    GLsizei mRepeatDraw;
    515 
    516    bool mSceneStarted;
    517 
    518    bool mVertexTextureSupport;
    519 
    520    // current render target states
    521    unsigned int mAppliedRenderTargetSerial;
    522    unsigned int mAppliedDepthStencilSerial;
    523    bool mDepthStencilInitialized;
    524    bool mRenderTargetDescInitialized;
    525 
    526    IDirect3DStateBlock9 *mMaskedClearSavedState;
    527 
    528    StateManager9 mStateManager;
    529 
    530    // Currently applied sampler states
    531    struct CurSamplerState
    532    {
    533        CurSamplerState();
    534 
    535        bool forceSet;
    536        size_t baseLevel;
    537        gl::SamplerState samplerState;
    538    };
    539    std::vector<CurSamplerState> mCurVertexSamplerStates;
    540    std::vector<CurSamplerState> mCurPixelSamplerStates;
    541 
    542    // Currently applied textures
    543    std::vector<uintptr_t> mCurVertexTextures;
    544    std::vector<uintptr_t> mCurPixelTextures;
    545 
    546    unsigned int mAppliedIBSerial;
    547    IDirect3DVertexShader9 *mAppliedVertexShader;
    548    IDirect3DPixelShader9 *mAppliedPixelShader;
    549    unsigned int mAppliedProgramSerial;
    550 
    551    // A pool of event queries that are currently unused.
    552    std::vector<IDirect3DQuery9 *> mEventQueryPool;
    553    VertexShaderCache mVertexShaderCache;
    554    PixelShaderCache mPixelShaderCache;
    555 
    556    VertexDataManager *mVertexDataManager;
    557    VertexDeclarationCache mVertexDeclarationCache;
    558 
    559    IndexDataManager *mIndexDataManager;
    560    StreamingIndexBufferInterface *mLineLoopIB;
    561    StaticIndexBufferInterface *mCountingIB;
    562 
    563    enum
    564    {
    565        NUM_NULL_COLORBUFFER_CACHE_ENTRIES = 12
    566    };
    567    struct NullRenderTargetCacheEntry
    568    {
    569        UINT lruCount;
    570        int width;
    571        int height;
    572        RenderTarget9 *renderTarget;
    573    };
    574 
    575    std::array<NullRenderTargetCacheEntry, NUM_NULL_COLORBUFFER_CACHE_ENTRIES>
    576        mNullRenderTargetCache;
    577    UINT mMaxNullColorbufferLRU;
    578 
    579    std::vector<TranslatedAttribute> mTranslatedAttribCache;
    580 
    581    DebugAnnotator9 mAnnotator;
    582 };
    583 
    584 }  // namespace rx
    585 
    586 #endif  // LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_