summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp30
-rw-r--r--Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h2
-rw-r--r--Source/Plugins/Plugin_VideoDX9/Src/Render.cpp21
3 files changed, 42 insertions, 11 deletions
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");