Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / libGLESv2 / renderer / d3d / d3d9 / Blit9.h
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 // Blit9.cpp: Surface copy utility class.
8
9 #ifndef LIBGLESV2_BLIT9_H_
10 #define LIBGLESV2_BLIT9_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 Blit9
26 {
27   public:
28     explicit Blit9(Renderer9 *renderer);
29     ~Blit9();
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(Blit9);
91 };
92 }
93
94 #endif   // LIBGLESV2_BLIT9_H_