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 <map>
13
14#define GL_APICALL
15#include <GLES2/gl2.h>
16
17#include <d3d9.h>
18
19#include "common/angleutils.h"
20
21namespace gl
22{
23class Context;
24
25class Blit
26{
27  public:
28    explicit Blit(Context *context);
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    // 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.
34    bool formatConvert(IDirect3DSurface9 *source, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, IDirect3DSurface9 *dest);
35
36    // 2x2 box filter sample from source to dest.
37    // Requires that source is RGB(A) and dest has the same format as source.
38    bool boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
39
40  private:
41    Context *mContext;
42
43    IDirect3DVertexBuffer9 *mQuadVertexBuffer;
44    IDirect3DVertexDeclaration9 *mQuadVertexDeclaration;
45
46    void initGeometry();
47
48    bool setFormatConvertShaders(GLenum destFormat);
49
50    IDirect3DTexture9 *copySurfaceToTexture(IDirect3DSurface9 *surface, const RECT &sourceRect);
51    void setViewport(const RECT &sourceRect, GLint xoffset, GLint yoffset);
52    void setCommonBlitState();
53    RECT getSurfaceRect(IDirect3DSurface9 *surface) const;
54
55    // This enum is used to index mCompiledShaders and mShaderSource.
56    enum ShaderId
57    {
58        SHADER_VS_STANDARD,
59        SHADER_VS_FLIPY,
60        SHADER_PS_PASSTHROUGH,
61        SHADER_PS_LUMINANCE,
62        SHADER_PS_COMPONENTMASK,
63        SHADER_COUNT
64    };
65
66    static const char * const mShaderSource[];
67
68    // This actually contains IDirect3DVertexShader9 or IDirect3DPixelShader9 casted to IUnknown.
69    IUnknown *mCompiledShaders[SHADER_COUNT];
70
71    template <class D3DShaderType>
72    bool setShader(ShaderId source, const char *profile,
73                   HRESULT (WINAPI IDirect3DDevice9::*createShader)(const DWORD *, D3DShaderType **),
74                   HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType*));
75
76    bool setVertexShader(ShaderId shader);
77    bool setPixelShader(ShaderId shader);
78    void render();
79
80    void saveState();
81    void restoreState();
82    IDirect3DStateBlock9 *mSavedStateBlock;
83    IDirect3DSurface9 *mSavedRenderTarget;
84    IDirect3DSurface9 *mSavedDepthStencil;
85
86    DISALLOW_COPY_AND_ASSIGN(Blit);
87};
88}
89
90#endif   // LIBGLESV2_BLIT_H_
91