Home | History | Annotate | Download | only in renderer
      1 //
      2 // Copyright (c) 2002-2010 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 // Blit.cpp: Surface copy utility class.
      8 
      9 #ifndef LIBGLESV2_BLIT_H_
     10 #define LIBGLESV2_BLIT_H_
     11 
     12 #include "common/angleutils.h"
     13 
     14 namespace gl
     15 {
     16 class Framebuffer;
     17 }
     18 
     19 namespace rx
     20 {
     21 class Renderer9;
     22 class TextureStorageInterface2D;
     23 class TextureStorageInterfaceCube;
     24 
     25 class Blit
     26 {
     27   public:
     28     explicit Blit(Renderer9 *renderer);
     29     ~Blit();
     30 
     31     // Copy from source surface to dest surface.
     32     // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left)
     33     bool copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level);
     34     bool copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level);
     35 
     36     // Copy from source surface to dest surface.
     37     // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left)
     38     // source is interpreted as RGBA and destFormat specifies the desired result format. For example, if destFormat = GL_RGB, the alpha channel will be forced to 0.
     39     bool formatConvert(IDirect3DSurface9 *source, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, IDirect3DSurface9 *dest);
     40 
     41     // 2x2 box filter sample from source to dest.
     42     // Requires that source is RGB(A) and dest has the same format as source.
     43     bool boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
     44 
     45   private:
     46     rx::Renderer9 *mRenderer;
     47 
     48     IDirect3DVertexBuffer9 *mQuadVertexBuffer;
     49     IDirect3DVertexDeclaration9 *mQuadVertexDeclaration;
     50 
     51     void initGeometry();
     52 
     53     bool setFormatConvertShaders(GLenum destFormat);
     54 
     55     bool copy(IDirect3DSurface9 *source, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, IDirect3DSurface9 *dest);
     56     IDirect3DTexture9 *copySurfaceToTexture(IDirect3DSurface9 *surface, const RECT &sourceRect);
     57     void setViewport(const RECT &sourceRect, GLint xoffset, GLint yoffset);
     58     void setCommonBlitState();
     59     RECT getSurfaceRect(IDirect3DSurface9 *surface) const;
     60 
     61     // This enum is used to index mCompiledShaders and mShaderSource.
     62     enum ShaderId
     63     {
     64         SHADER_VS_STANDARD,
     65         SHADER_VS_FLIPY,
     66         SHADER_PS_PASSTHROUGH,
     67         SHADER_PS_LUMINANCE,
     68         SHADER_PS_COMPONENTMASK,
     69         SHADER_COUNT
     70     };
     71 
     72     // This actually contains IDirect3DVertexShader9 or IDirect3DPixelShader9 casted to IUnknown.
     73     IUnknown *mCompiledShaders[SHADER_COUNT];
     74 
     75     template <class D3DShaderType>
     76     bool setShader(ShaderId source, const char *profile,
     77                    D3DShaderType *(Renderer9::*createShader)(const DWORD *, size_t length),
     78                    HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType*));
     79 
     80     bool setVertexShader(ShaderId shader);
     81     bool setPixelShader(ShaderId shader);
     82     void render();
     83 
     84     void saveState();
     85     void restoreState();
     86     IDirect3DStateBlock9 *mSavedStateBlock;
     87     IDirect3DSurface9 *mSavedRenderTarget;
     88     IDirect3DSurface9 *mSavedDepthStencil;
     89 
     90     DISALLOW_COPY_AND_ASSIGN(Blit);
     91 };
     92 }
     93 
     94 #endif   // LIBGLESV2_BLIT_H_
     95