1 // Copyright (c) 2012- PPSSPP Project. 2 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU General Public License as published by 5 // the Free Software Foundation, version 2.0 or later versions. 6 7 // This program is distributed in the hope that it will be useful, 8 // but WITHOUT ANY WARRANTY; without even the implied warranty of 9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 // GNU General Public License 2.0 for more details. 11 12 // A copy of the GPL 2.0 should have been included with the program. 13 // If not, see http://www.gnu.org/licenses/ 14 15 // Official git repository and contact information can be found at 16 // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. 17 18 #pragma once 19 20 #include <unordered_map> 21 22 #include <d3d9.h> 23 24 // Keeps track of allocated FBOs. 25 // Also provides facilities for drawing and later converting raw 26 // pixel data. 27 28 #include "GPU/GPUCommon.h" 29 #include "GPU/Common/FramebufferManagerCommon.h" 30 31 namespace DX9 { 32 33 class TextureCacheDX9; 34 class DrawEngineDX9; 35 class ShaderManagerDX9; 36 37 class FramebufferManagerDX9 : public FramebufferManagerCommon { 38 public: 39 FramebufferManagerDX9(Draw::DrawContext *draw); 40 ~FramebufferManagerDX9(); 41 42 void SetTextureCache(TextureCacheDX9 *tc); 43 void SetShaderManager(ShaderManagerDX9 *sm); 44 void SetDrawEngine(DrawEngineDX9 *td); 45 void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation, int flags) override; 46 47 void DestroyAllFBOs() override; 48 49 void EndFrame(); 50 51 virtual bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; 52 53 bool GetFramebuffer(u32 fb_address, int fb_stride, GEBufferFormat format, GPUDebugBuffer &buffer, int maxRes) override; 54 bool GetDepthbuffer(u32 fb_address, int fb_stride, u32 z_address, int z_stride, GPUDebugBuffer &buffer) override; 55 bool GetStencilbuffer(u32 fb_address, int fb_stride, GPUDebugBuffer &buffer) override; 56 bool GetOutputFramebuffer(GPUDebugBuffer &buffer) override; 57 58 LPDIRECT3DSURFACE9 GetOffscreenSurface(LPDIRECT3DSURFACE9 similarSurface, VirtualFramebuffer *vfb); 59 LPDIRECT3DSURFACE9 GetOffscreenSurface(D3DFORMAT fmt, u32 w, u32 h); 60 61 protected: 62 void Bind2DShader() override; 63 void DecimateFBOs() override; 64 65 // Used by ReadFramebufferToMemory and later framebuffer block copies 66 void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp, const char *tag) override; 67 68 private: 69 void PackFramebufferSync_(VirtualFramebuffer *vfb, int x, int y, int w, int h) override; 70 void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h); 71 bool GetRenderTargetFramebuffer(LPDIRECT3DSURFACE9 renderTarget, LPDIRECT3DSURFACE9 offscreen, int w, int h, GPUDebugBuffer &buffer); 72 73 LPDIRECT3DDEVICE9 device_; 74 LPDIRECT3DDEVICE9 deviceEx_; 75 76 LPDIRECT3DVERTEXSHADER9 pFramebufferVertexShader = nullptr; 77 LPDIRECT3DPIXELSHADER9 pFramebufferPixelShader = nullptr; 78 LPDIRECT3DVERTEXDECLARATION9 pFramebufferVertexDecl = nullptr; 79 80 LPDIRECT3DPIXELSHADER9 stencilUploadPS_ = nullptr; 81 LPDIRECT3DVERTEXSHADER9 stencilUploadVS_ = nullptr; 82 bool stencilUploadFailed_ = false; 83 FramebufferManagerDX9(Draw::DrawContext * draw)84 LPDIRECT3DTEXTURE9 nullTex_ = nullptr; 85 86 TextureCacheDX9 *textureCacheDX9_; 87 ShaderManagerDX9 *shaderManagerDX9_; 88 DrawEngineDX9 *drawEngineD3D9_; 89 90 struct OffscreenSurface { 91 LPDIRECT3DSURFACE9 surface; 92 int last_frame_used; 93 }; 94 95 std::unordered_map<u64, OffscreenSurface> offscreenSurfaces_; 96 }; 97 98 }; 99