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