tor-browser

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

Blit9.h (6658B)


      1 //
      2 // Copyright 2002 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 // Blit9.cpp: Surface copy utility class.
      8 
      9 #ifndef LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_
     10 #define LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_
     11 
     12 #include "common/PackedEnums.h"
     13 #include "common/angleutils.h"
     14 #include "libANGLE/Error.h"
     15 
     16 namespace gl
     17 {
     18 class Context;
     19 class Framebuffer;
     20 class Texture;
     21 struct Extents;
     22 struct Offset;
     23 }  // namespace gl
     24 
     25 namespace rx
     26 {
     27 class Context9;
     28 class Renderer9;
     29 class TextureStorage;
     30 
     31 namespace d3d
     32 {
     33 class Context;
     34 }  // namespace d3d
     35 
     36 class Blit9 : angle::NonCopyable
     37 {
     38  public:
     39    explicit Blit9(Renderer9 *renderer);
     40    ~Blit9();
     41 
     42    angle::Result initialize(Context9 *context9);
     43 
     44    // Copy from source surface to dest surface.
     45    // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left)
     46    angle::Result copy2D(const gl::Context *context,
     47                         const gl::Framebuffer *framebuffer,
     48                         const RECT &sourceRect,
     49                         GLenum destFormat,
     50                         const gl::Offset &destOffset,
     51                         TextureStorage *storage,
     52                         GLint level);
     53    angle::Result copyCube(const gl::Context *context,
     54                           const gl::Framebuffer *framebuffer,
     55                           const RECT &sourceRect,
     56                           GLenum destFormat,
     57                           const gl::Offset &destOffset,
     58                           TextureStorage *storage,
     59                           gl::TextureTarget target,
     60                           GLint level);
     61    angle::Result copyTexture(const gl::Context *context,
     62                              const gl::Texture *source,
     63                              GLint sourceLevel,
     64                              const RECT &sourceRect,
     65                              GLenum destFormat,
     66                              const gl::Offset &destOffset,
     67                              TextureStorage *storage,
     68                              gl::TextureTarget destTarget,
     69                              GLint destLevel,
     70                              bool flipY,
     71                              bool premultiplyAlpha,
     72                              bool unmultiplyAlpha);
     73 
     74    // 2x2 box filter sample from source to dest.
     75    // Requires that source is RGB(A) and dest has the same format as source.
     76    angle::Result boxFilter(Context9 *context9, IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
     77 
     78  private:
     79    Renderer9 *mRenderer;
     80 
     81    bool mGeometryLoaded;
     82    IDirect3DVertexBuffer9 *mQuadVertexBuffer;
     83    IDirect3DVertexDeclaration9 *mQuadVertexDeclaration;
     84 
     85    // Copy from source texture to dest surface.
     86    // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left)
     87    // source is interpreted as RGBA and destFormat specifies the desired result format. For
     88    // example, if destFormat = GL_RGB, the alpha channel will be forced to 0.
     89    angle::Result formatConvert(Context9 *context9,
     90                                IDirect3DBaseTexture9 *source,
     91                                const RECT &sourceRect,
     92                                const gl::Extents &sourceSize,
     93                                GLenum destFormat,
     94                                const gl::Offset &destOffset,
     95                                IDirect3DSurface9 *dest,
     96                                bool flipY,
     97                                bool premultiplyAlpha,
     98                                bool unmultiplyAlpha);
     99    angle::Result setFormatConvertShaders(Context9 *context9,
    100                                          GLenum destFormat,
    101                                          bool flipY,
    102                                          bool premultiplyAlpha,
    103                                          bool unmultiplyAlpha);
    104 
    105    angle::Result copy(Context9 *context9,
    106                       IDirect3DSurface9 *source,
    107                       IDirect3DBaseTexture9 *sourceTexture,
    108                       const RECT &sourceRect,
    109                       GLenum destFormat,
    110                       const gl::Offset &destOffset,
    111                       IDirect3DSurface9 *dest,
    112                       bool flipY,
    113                       bool premultiplyAlpha,
    114                       bool unmultiplyAlpha);
    115    angle::Result copySurfaceToTexture(Context9 *context9,
    116                                       IDirect3DSurface9 *surface,
    117                                       const RECT &sourceRect,
    118                                       angle::ComPtr<IDirect3DBaseTexture9> *outTexture);
    119    void setViewportAndShaderConstants(const RECT &sourceRect,
    120                                       const gl::Extents &sourceSize,
    121                                       const RECT &destRect,
    122                                       bool flipY);
    123    void setCommonBlitState();
    124    RECT getSurfaceRect(IDirect3DSurface9 *surface) const;
    125    gl::Extents getSurfaceSize(IDirect3DSurface9 *surface) const;
    126 
    127    // This enum is used to index mCompiledShaders and mShaderSource.
    128    enum ShaderId
    129    {
    130        SHADER_VS_STANDARD,
    131        SHADER_PS_PASSTHROUGH,
    132        SHADER_PS_LUMINANCE,
    133        SHADER_PS_LUMINANCE_PREMULTIPLY_ALPHA,
    134        SHADER_PS_LUMINANCE_UNMULTIPLY_ALPHA,
    135        SHADER_PS_COMPONENTMASK,
    136        SHADER_PS_COMPONENTMASK_PREMULTIPLY_ALPHA,
    137        SHADER_PS_COMPONENTMASK_UNMULTIPLY_ALPHA,
    138        SHADER_COUNT,
    139    };
    140 
    141    // This actually contains IDirect3DVertexShader9 or IDirect3DPixelShader9 casted to IUnknown.
    142    IUnknown *mCompiledShaders[SHADER_COUNT];
    143 
    144    template <class D3DShaderType>
    145    angle::Result setShader(Context9 *,
    146                            ShaderId source,
    147                            const char *profile,
    148                            angle::Result (Renderer9::*createShader)(d3d::Context *context,
    149                                                                     const DWORD *,
    150                                                                     size_t length,
    151                                                                     D3DShaderType **outShader),
    152                            HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType *));
    153 
    154    angle::Result setVertexShader(Context9 *context9, ShaderId shader);
    155    angle::Result setPixelShader(Context9 *context9, ShaderId shader);
    156    void render();
    157 
    158    void saveState();
    159    void restoreState();
    160    IDirect3DStateBlock9 *mSavedStateBlock;
    161    IDirect3DSurface9 *mSavedRenderTarget;
    162    IDirect3DSurface9 *mSavedDepthStencil;
    163 };
    164 }  // namespace rx
    165 
    166 #endif  // LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_