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