// // Copyright 2002 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Blit9.cpp: Surface copy utility class. #ifndef LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_ #define LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_ #include "common/PackedEnums.h" #include "common/angleutils.h" #include "libANGLE/Error.h" namespace gl { class Context; class Framebuffer; class Texture; struct Extents; struct Offset; } // namespace gl namespace rx { class Context9; class Renderer9; class TextureStorage; namespace d3d { class Context; } // namespace d3d class Blit9 : angle::NonCopyable { public: explicit Blit9(Renderer9 *renderer); ~Blit9(); angle::Result initialize(Context9 *context9); // Copy from source surface to dest surface. // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left) angle::Result copy2D(const gl::Context *context, const gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, const gl::Offset &destOffset, TextureStorage *storage, GLint level); angle::Result copyCube(const gl::Context *context, const gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, const gl::Offset &destOffset, TextureStorage *storage, gl::TextureTarget target, GLint level); angle::Result copyTexture(const gl::Context *context, const gl::Texture *source, GLint sourceLevel, const RECT &sourceRect, GLenum destFormat, const gl::Offset &destOffset, TextureStorage *storage, gl::TextureTarget destTarget, GLint destLevel, bool flipY, bool premultiplyAlpha, bool unmultiplyAlpha); // 2x2 box filter sample from source to dest. // Requires that source is RGB(A) and dest has the same format as source. angle::Result boxFilter(Context9 *context9, IDirect3DSurface9 *source, IDirect3DSurface9 *dest); private: Renderer9 *mRenderer; bool mGeometryLoaded; IDirect3DVertexBuffer9 *mQuadVertexBuffer; IDirect3DVertexDeclaration9 *mQuadVertexDeclaration; // Copy from source texture to dest surface. // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left) // 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. angle::Result formatConvert(Context9 *context9, IDirect3DBaseTexture9 *source, const RECT &sourceRect, const gl::Extents &sourceSize, GLenum destFormat, const gl::Offset &destOffset, IDirect3DSurface9 *dest, bool flipY, bool premultiplyAlpha, bool unmultiplyAlpha); angle::Result setFormatConvertShaders(Context9 *context9, GLenum destFormat, bool flipY, bool premultiplyAlpha, bool unmultiplyAlpha); angle::Result copy(Context9 *context9, IDirect3DSurface9 *source, IDirect3DBaseTexture9 *sourceTexture, const RECT &sourceRect, GLenum destFormat, const gl::Offset &destOffset, IDirect3DSurface9 *dest, bool flipY, bool premultiplyAlpha, bool unmultiplyAlpha); angle::Result copySurfaceToTexture(Context9 *context9, IDirect3DSurface9 *surface, const RECT &sourceRect, angle::ComPtr *outTexture); void setViewportAndShaderConstants(const RECT &sourceRect, const gl::Extents &sourceSize, const RECT &destRect, bool flipY); void setCommonBlitState(); RECT getSurfaceRect(IDirect3DSurface9 *surface) const; gl::Extents getSurfaceSize(IDirect3DSurface9 *surface) const; // This enum is used to index mCompiledShaders and mShaderSource. enum ShaderId { SHADER_VS_STANDARD, SHADER_PS_PASSTHROUGH, SHADER_PS_LUMINANCE, SHADER_PS_LUMINANCE_PREMULTIPLY_ALPHA, SHADER_PS_LUMINANCE_UNMULTIPLY_ALPHA, SHADER_PS_COMPONENTMASK, SHADER_PS_COMPONENTMASK_PREMULTIPLY_ALPHA, SHADER_PS_COMPONENTMASK_UNMULTIPLY_ALPHA, SHADER_COUNT, }; // This actually contains IDirect3DVertexShader9 or IDirect3DPixelShader9 casted to IUnknown. IUnknown *mCompiledShaders[SHADER_COUNT]; template angle::Result setShader(Context9 *, ShaderId source, const char *profile, angle::Result (Renderer9::*createShader)(d3d::Context *context, const DWORD *, size_t length, D3DShaderType **outShader), HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType *)); angle::Result setVertexShader(Context9 *context9, ShaderId shader); angle::Result setPixelShader(Context9 *context9, ShaderId shader); void render(); void saveState(); void restoreState(); IDirect3DStateBlock9 *mSavedStateBlock; IDirect3DSurface9 *mSavedRenderTarget; IDirect3DSurface9 *mSavedDepthStencil; }; } // namespace rx #endif // LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_