1a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
2a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Use of this source code is governed by a BSD-style license that can be
4a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// found in the LICENSE file.
5a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
6a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
7a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Blit.cpp: Surface copy utility class.
8a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
9a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#ifndef LIBGLESV2_BLIT_H_
10a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define LIBGLESV2_BLIT_H_
11a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
12a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <map>
13a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
14a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define GL_APICALL
15a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <GLES2/gl2.h>
16a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
17a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <d3d9.h>
18a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
19a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "common/angleutils.h"
20a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
21a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocknamespace gl
22a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
23a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockclass Context;
24a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
25a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockclass Blit
26a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
27a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block  public:
28a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    explicit Blit(Context *context);
29a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    ~Blit();
30a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
31a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Copy from source surface to dest surface.
32a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left)
33a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // 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.
34a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool formatConvert(IDirect3DSurface9 *source, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, IDirect3DSurface9 *dest);
35a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
36a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // 2x2 box filter sample from source to dest.
37a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Requires that source is RGB(A) and dest has the same format as source.
38a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
39a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
40a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block  private:
41a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    Context *mContext;
42a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
43a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    IDirect3DVertexBuffer9 *mQuadVertexBuffer;
44a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    IDirect3DVertexDeclaration9 *mQuadVertexDeclaration;
45a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
46a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void initGeometry();
47a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
48a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool setFormatConvertShaders(GLenum destFormat);
49a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
50a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    IDirect3DTexture9 *copySurfaceToTexture(IDirect3DSurface9 *surface, const RECT &sourceRect);
51a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void setViewport(const RECT &sourceRect, GLint xoffset, GLint yoffset);
52a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void setCommonBlitState();
53a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    RECT getSurfaceRect(IDirect3DSurface9 *surface) const;
54a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
55a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // This enum is used to index mCompiledShaders and mShaderSource.
56a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    enum ShaderId
57a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
58a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        SHADER_VS_STANDARD,
59a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        SHADER_VS_FLIPY,
60a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        SHADER_PS_PASSTHROUGH,
61a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        SHADER_PS_LUMINANCE,
62a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        SHADER_PS_COMPONENTMASK,
63a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        SHADER_COUNT
64a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    };
65a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
66a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    static const char * const mShaderSource[];
67a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
68a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // This actually contains IDirect3DVertexShader9 or IDirect3DPixelShader9 casted to IUnknown.
69a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    IUnknown *mCompiledShaders[SHADER_COUNT];
70a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
71a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    template <class D3DShaderType>
72a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool setShader(ShaderId source, const char *profile,
73a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                   HRESULT (WINAPI IDirect3DDevice9::*createShader)(const DWORD *, D3DShaderType **),
74a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                   HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType*));
75a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
76a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool setVertexShader(ShaderId shader);
77a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool setPixelShader(ShaderId shader);
78a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void render();
79a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
80a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void saveState();
81a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void restoreState();
82a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    IDirect3DStateBlock9 *mSavedStateBlock;
83a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    IDirect3DSurface9 *mSavedRenderTarget;
84a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    IDirect3DSurface9 *mSavedDepthStencil;
85a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
86a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    DISALLOW_COPY_AND_ASSIGN(Blit);
87a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block};
88a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
89a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
90a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#endif   // LIBGLESV2_BLIT_H_
91