diff --git a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp index 089e181f96..05b2f09932 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp @@ -18,6 +18,7 @@ #include "D3DBase.h" #include "Render.h" #include "FramebufferManager.h" +#include "VideoConfig.h" namespace FBManager { @@ -25,6 +26,10 @@ namespace FBManager static LPDIRECT3DTEXTURE9 s_efb_color_texture; static LPDIRECT3DSURFACE9 s_efb_color_surface; static LPDIRECT3DSURFACE9 s_efb_depth_surface; + +static LPDIRECT3DSURFACE9 s_efb_color_OffScreensurface; + + static D3DFORMAT s_efb_color_surface_Format; static D3DFORMAT s_efb_depth_surface_Format; #undef CHECK @@ -32,6 +37,8 @@ static D3DFORMAT s_efb_depth_surface_Format; LPDIRECT3DSURFACE9 GetEFBColorRTSurface() { return s_efb_color_surface; } LPDIRECT3DSURFACE9 GetEFBDepthRTSurface() { return s_efb_depth_surface; } +LPDIRECT3DSURFACE9 GetEFBColorOffScreenRTSurface() { return s_efb_color_OffScreensurface; } + D3DFORMAT GetEFBDepthRTSurfaceFormat(){return s_efb_depth_surface_Format;} D3DFORMAT GetEFBColorRTSurfaceFormat(){return s_efb_color_surface_Format;} @@ -61,29 +68,40 @@ void Create() CHECK(hr); hr = s_efb_color_texture->GetSurfaceLevel(0, &s_efb_color_surface); + CHECK(hr); + hr = D3D::dev->CreateOffscreenPlainSurface(target_width, target_height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &s_efb_color_OffScreensurface, NULL ); CHECK(hr); - //Select Zbuffer format supported by hadware. - s_efb_depth_surface_Format = D3DFMT_D32F_LOCKABLE; + if (g_ActiveConfig.bEFBAccessEnable) + { + s_efb_depth_surface_Format = D3DFMT_D32F_LOCKABLE; + } + else + { + s_efb_depth_surface_Format = D3DFMT_D24S8; + } hr = D3D::dev->CreateDepthStencilSurface(target_width, target_height, D3DFMT_D32F_LOCKABLE, - D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL); + D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL); if (FAILED(hr)) { s_efb_depth_surface_Format = D3DFMT_D16_LOCKABLE; hr = D3D::dev->CreateDepthStencilSurface(target_width, target_height, D3DFMT_D16_LOCKABLE, - D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL); + D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL); if(FAILED(hr)) { s_efb_depth_surface_Format = D3DFMT_D24S8; hr = D3D::dev->CreateDepthStencilSurface(target_width, target_height, D3DFMT_D24S8, - D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL); + D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL); } - } + } CHECK(hr); } void Destroy() { + if(s_efb_color_OffScreensurface) + s_efb_color_OffScreensurface->Release(); + if(s_efb_depth_surface) s_efb_depth_surface->Release(); s_efb_depth_surface = NULL; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h index 3fa298c16c..59dbd62604 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h +++ b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h @@ -34,6 +34,8 @@ LPDIRECT3DTEXTURE9 GetEFBDepthTexture(const EFBRectangle& sourceRc); LPDIRECT3DSURFACE9 GetEFBColorRTSurface(); LPDIRECT3DSURFACE9 GetEFBDepthRTSurface(); +LPDIRECT3DSURFACE9 GetEFBColorOffScreenRTSurface(); +LPDIRECT3DSURFACE9 GetEFBDepthOffScreenRTSurface(); D3DFORMAT GetEFBDepthRTSurfaceFormat(); D3DFORMAT GetEFBColorRTSurfaceFormat(); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp index 801f982e72..7cf3b803d4 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp @@ -444,6 +444,10 @@ u32 Renderer::AccessEFB(EFBAccessType type, int x, int y) //Get the working buffer and it's format LPDIRECT3DSURFACE9 pBuffer = (type == PEEK_Z || type == POKE_Z) ? FBManager::GetEFBDepthRTSurface() : FBManager::GetEFBColorRTSurface(); + + LPDIRECT3DSURFACE9 pOffScreenBuffer = (type == PEEK_Z || type == POKE_Z) ? + FBManager::GetEFBDepthRTSurface() : FBManager::GetEFBColorOffScreenRTSurface(); + D3DLOCKED_RECT drect; D3DFORMAT BufferFormat = (type == PEEK_Z || type == POKE_Z) ? @@ -469,10 +473,6 @@ u32 Renderer::AccessEFB(EFBAccessType type, int x, int y) TargetRectangle targetPixelRc = Renderer::ConvertEFBRectangle(efbPixelRc); - // Sample from the center of the target region. - int srcX = (targetPixelRc.left + targetPixelRc.right) / 2; - int srcY = (targetPixelRc.top + targetPixelRc.bottom) / 2; - u32 z = 0; float val = 0.0f; HRESULT hr; @@ -483,7 +483,18 @@ u32 Renderer::AccessEFB(EFBAccessType type, int x, int y) RectToLock.top = targetPixelRc.top; //lock the buffer - if((hr = pBuffer->LockRect(&drect, &RectToLock, D3DLOCK_READONLY)) != D3D_OK) + + if(!(type == PEEK_Z || type == POKE_Z)) + { + hr = D3D::dev->StretchRect(pBuffer,&RectToLock,pOffScreenBuffer,&RectToLock, D3DTEXF_NONE); + if(FAILED(hr)) + { + PanicAlert("Unable to copy data to mem buffer"); + return 0; + } + } + + if((hr = pOffScreenBuffer->LockRect(&drect, &RectToLock, D3DLOCK_READONLY)) != D3D_OK) PanicAlert("ERROR: %s", hr == D3DERR_WASSTILLDRAWING ? "Still drawing" : hr == D3DERR_INVALIDCALL ? "Invalid call" : "w00t");