summaryrefslogtreecommitdiff
path: root/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp')
-rw-r--r--Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp135
1 files changed, 59 insertions, 76 deletions
diff --git a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp
index 6c03a290bf..1abfebaf16 100644
--- a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp
+++ b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp
@@ -26,10 +26,9 @@ namespace FBManager
static LPDIRECT3DTEXTURE9 s_efb_color_texture;//Texture thats contains the color data of the render target
static LPDIRECT3DTEXTURE9 s_efb_colorRead_texture;//1 pixel texture for temporal data store
static LPDIRECT3DTEXTURE9 s_efb_depth_texture;//Texture thats contains the depth data of the render target
-static LPDIRECT3DTEXTURE9 s_efb_depthRead_texture;//1 pixel texture for temporal data store
+static LPDIRECT3DTEXTURE9 s_efb_depthRead_texture;//4 pixel texture for temporal data store
static LPDIRECT3DSURFACE9 s_efb_depth_surface;//Depth Surface
-static LPDIRECT3DSURFACE9 s_efb_depthColor_surface;//Depth, color encoded Surface
static LPDIRECT3DSURFACE9 s_efb_color_surface;//Color Surface
static LPDIRECT3DSURFACE9 s_efb_color_ReadBuffer;//Surface 0 of s_efb_colorRead_texture
static LPDIRECT3DSURFACE9 s_efb_depth_ReadBuffer;//Surface 0 of s_efb_depthRead_texture
@@ -39,7 +38,8 @@ static LPDIRECT3DSURFACE9 s_efb_depth_OffScreenReadBuffer;//System memory Surfac
static D3DFORMAT s_efb_color_surface_Format;//Format of the color Surface
-static D3DFORMAT s_efb_depth_surface_Format;//Format of the Depth color encoded Surface
+static D3DFORMAT s_efb_depth_surface_Format;//Format of the Depth Surface
+static D3DFORMAT s_efb_depth_ReadBuffer_Format;//Format of the Depth color Read Surface
#undef CHECK
#define CHECK(hr,Message) if (FAILED(hr)) { PanicAlert(__FUNCTION__ " FAIL: %s" ,Message); }
@@ -54,11 +54,6 @@ LPDIRECT3DSURFACE9 GetEFBDepthRTSurface()
return s_efb_depth_surface;
}
-LPDIRECT3DSURFACE9 GetEFBDepthEncodedSurface()
-{
- return s_efb_depthColor_surface;
-}
-
LPDIRECT3DSURFACE9 GetEFBColorOffScreenRTSurface()
{
return s_efb_color_OffScreenReadBuffer;
@@ -69,20 +64,20 @@ LPDIRECT3DSURFACE9 GetEFBDepthOffScreenRTSurface()
}
LPDIRECT3DSURFACE9 GetEFBColorReadSurface()
-{
-
+{
return s_efb_color_ReadBuffer;
}
+
LPDIRECT3DSURFACE9 GetEFBDepthReadSurface()
-{
-
+{
return s_efb_depth_ReadBuffer;
}
-
D3DFORMAT GetEFBDepthRTSurfaceFormat(){return s_efb_depth_surface_Format;}
+D3DFORMAT GetEFBDepthReadSurfaceFormat(){return s_efb_depth_ReadBuffer_Format;}
D3DFORMAT GetEFBColorRTSurfaceFormat(){return s_efb_color_surface_Format;}
+
LPDIRECT3DTEXTURE9 GetEFBColorTexture(const EFBRectangle& sourceRc)
{
return s_efb_color_texture;
@@ -94,9 +89,10 @@ LPDIRECT3DTEXTURE9 GetEFBDepthTexture(const EFBRectangle &sourceRc)
return s_efb_depth_texture;
}
+
+
void Create()
-{
-
+{
// Simplest possible setup to start with.
int target_width = Renderer::GetTargetWidth();
int target_height = Renderer::GetTargetHeight();
@@ -106,7 +102,7 @@ void Create()
D3DPOOL_DEFAULT, &s_efb_color_texture, NULL);
if(s_efb_color_texture)
{
- s_efb_color_texture->GetSurfaceLevel(0,&s_efb_color_surface);
+ hr = s_efb_color_texture->GetSurfaceLevel(0,&s_efb_color_surface);
}
CHECK(hr,"Create Color Texture");
hr = D3D::dev->CreateTexture(1, 1, 1, D3DUSAGE_RENDERTARGET, s_efb_color_surface_Format,
@@ -122,73 +118,64 @@ void Create()
//Select Zbuffer format supported by hadware.
if (g_ActiveConfig.bEFBAccessEnable)
- {
- if(D3D::GetCaps().NumSimultaneousRTs > 1)
+ {
+ D3DFORMAT *DepthTexFormats = new D3DFORMAT[5];
+ DepthTexFormats[0] = FOURCC_INTZ;
+ DepthTexFormats[1] = FOURCC_DF24;
+ DepthTexFormats[2] = FOURCC_RAWZ;
+ DepthTexFormats[3] = FOURCC_DF16;
+ DepthTexFormats[4] = D3DFMT_D24X8;
+
+ for(int i = 0;i<5;i++)
+ {
+ s_efb_depth_surface_Format = DepthTexFormats[i];
+ //get the framebuffer Depth texture
+ hr = D3D::dev->CreateTexture(target_width, target_height, 1, D3DUSAGE_DEPTHSTENCIL, s_efb_depth_surface_Format,
+ D3DPOOL_DEFAULT, &s_efb_depth_texture, NULL);
+ if (!FAILED(hr)) break;
+ }
+ CHECK(hr,"Depth Color Texture");
+ //get the Surface
+ if(s_efb_depth_texture)
+ {
+ s_efb_depth_texture->GetSurfaceLevel(0,&s_efb_depth_surface);
+ }
+ //create a 4x4 pixel texture to work as a buffer for peeking
+ if(s_efb_depth_surface_Format == FOURCC_RAWZ || s_efb_depth_surface_Format == D3DFMT_D24X8)
{
- hr = D3D::dev->CreateDepthStencilSurface(target_width, target_height, D3DFMT_D24X8,
- D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL);
- CHECK(hr,"CreateDepthStencilSurface");
- D3DFORMAT *DepthTexFormats = new D3DFORMAT[3];
- DepthTexFormats[0] = D3DFMT_R32F;
- DepthTexFormats[1] = D3DFMT_A8R8G8B8;
-
- for(int i = 0;i<2;i++)
- {
- s_efb_depth_surface_Format = DepthTexFormats[i];
- //get the framebuffer Depth texture
- hr = D3D::dev->CreateTexture(target_width, target_height, 1, D3DUSAGE_RENDERTARGET, s_efb_depth_surface_Format,
- D3DPOOL_DEFAULT, &s_efb_depth_texture, NULL);
- if (!FAILED(hr)) break;
- }
- CHECK(hr,"Depth Color Texture");
- //get the Surface
- if(s_efb_depth_texture)
- {
- s_efb_depth_texture->GetSurfaceLevel(0,&s_efb_depthColor_surface);
- }
- //create a one pixel texture to work as a buffer for peeking
- hr = D3D::dev->CreateTexture(1, 1, 1, D3DUSAGE_RENDERTARGET, s_efb_depth_surface_Format,
- D3DPOOL_DEFAULT, &s_efb_depthRead_texture, NULL);
- CHECK(hr,"Create Depth Read texture");
- if(s_efb_depthRead_texture)
- {
- s_efb_depthRead_texture->GetSurfaceLevel(0,&s_efb_depth_ReadBuffer);
- }
- //create an offscreen surface that we can lock to retrieve the data
- hr = D3D::dev->CreateOffscreenPlainSurface(1, 1, s_efb_depth_surface_Format, D3DPOOL_SYSTEMMEM, &s_efb_depth_OffScreenReadBuffer, NULL );
- CHECK(hr,"Create Depth offScreen Surface");
- delete [] DepthTexFormats;
+ DepthTexFormats[0] = D3DFMT_A8R8G8B8;
}
else
{
- //depth format in prefered order
- D3DFORMAT *DepthTexFormats = new D3DFORMAT[3];
- DepthTexFormats[0] = D3DFMT_D32F_LOCKABLE;
- DepthTexFormats[1] = D3DFMT_D16_LOCKABLE;
- DepthTexFormats[2] = D3DFMT_D24X8;
- for(int i = 0;i<3;i++)
- {
- s_efb_depth_surface_Format = DepthTexFormats[i];
- hr = D3D::dev->CreateDepthStencilSurface(target_width, target_height, s_efb_depth_surface_Format,
- D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL);
- if (!FAILED(hr)) break;
- }
- s_efb_depth_ReadBuffer = s_efb_depth_surface;
- s_efb_depth_OffScreenReadBuffer = s_efb_depth_surface;
- //ULTRAAAAAAAAAAA ugly hack when no depth textures are supported
- s_efb_depthColor_surface = s_efb_color_surface;
- CHECK(hr,"CreateDepthStencilSurface");
- delete [] DepthTexFormats;
+ DepthTexFormats[0] = D3DFMT_R32F;
}
+ DepthTexFormats[1] = D3DFMT_A8R8G8B8;
+
+ for(int i = 0;i<2;i++)
+ {
+ s_efb_depth_ReadBuffer_Format = DepthTexFormats[i];
+ //get the framebuffer Depth texture
+ hr = D3D::dev->CreateTexture(4, 4, 1, D3DUSAGE_RENDERTARGET, s_efb_depth_ReadBuffer_Format,
+ D3DPOOL_DEFAULT, &s_efb_depthRead_texture, NULL);
+ if (!FAILED(hr)) break;
+ }
+
+ CHECK(hr,"Create Depth Read texture");
+ if(s_efb_depthRead_texture)
+ {
+ s_efb_depthRead_texture->GetSurfaceLevel(0,&s_efb_depth_ReadBuffer);
+ }
+ //create an offscreen surface that we can lock to retrieve the data
+ hr = D3D::dev->CreateOffscreenPlainSurface(4, 4, s_efb_depth_ReadBuffer_Format, D3DPOOL_SYSTEMMEM, &s_efb_depth_OffScreenReadBuffer, NULL );
+ CHECK(hr,"Create Depth offScreen Surface");
+ delete [] DepthTexFormats;
}
else
{
s_efb_depth_surface_Format = D3DFMT_D24X8;
hr = D3D::dev->CreateDepthStencilSurface(target_width, target_height, s_efb_depth_surface_Format,
D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL);
- CHECK(hr,"CreateDepthStencilSurface");
- //ULTRAAAAAAAAAAA ugly hack when no depth textures are supported
- //s_efb_depthColor_surface = s_efb_color_surface;
+ CHECK(hr,"CreateDepthStencilSurface");
}
}
@@ -199,10 +186,6 @@ if(s_efb_depth_surface)
s_efb_depth_surface->Release();
s_efb_depth_surface=NULL;
-if(s_efb_depthColor_surface)
-s_efb_depthColor_surface->Release();
-s_efb_depthColor_surface=NULL;
-
if(s_efb_color_surface)
s_efb_color_surface->Release();
s_efb_color_surface=NULL;