diff --git a/GPU/Directx9/FramebufferDX9.cpp b/GPU/Directx9/FramebufferDX9.cpp index 0781cacad..6260021d6 100644 --- a/GPU/Directx9/FramebufferDX9.cpp +++ b/GPU/Directx9/FramebufferDX9.cpp @@ -559,8 +559,8 @@ namespace DX9 { // Doesn't work. Use a shader maybe? fbo_bind_backbuffer_as_render_target(); - LPDIRECT3DTEXTURE9 srcTex = fbo_get_depth_texture(src->fbo_dx9); - LPDIRECT3DTEXTURE9 dstTex = fbo_get_depth_texture(dst->fbo_dx9); + LPDIRECT3DTEXTURE9 srcTex = (LPDIRECT3DTEXTURE9)fbo_get_api_texture(src->fbo_dx9, FB_DEPTH_BIT, 0); + LPDIRECT3DTEXTURE9 dstTex = (LPDIRECT3DTEXTURE9)fbo_get_api_texture(dst->fbo_dx9, FB_DEPTH_BIT, 0); if (srcTex && dstTex) { D3DSURFACE_DESC srcDesc; @@ -1063,7 +1063,7 @@ namespace DX9 { // Right now that's always 8888. DEBUG_LOG(HLE, "Reading framebuffer to mem, fb_address = %08x", fb_address); - LPDIRECT3DSURFACE9 renderTarget = fbo_get_color_for_read(vfb->fbo_dx9); + LPDIRECT3DSURFACE9 renderTarget = (LPDIRECT3DSURFACE9)fbo_get_api_texture(vfb->fbo_dx9, FB_COLOR_BIT | FB_SURFACE_BIT, 0); D3DSURFACE_DESC desc; renderTarget->GetDesc(&desc); @@ -1102,7 +1102,7 @@ namespace DX9 { DEBUG_LOG(SCEGE, "Reading depthbuffer to mem at %08x for vfb=%08x", z_address, vfb->fb_address); - LPDIRECT3DTEXTURE9 tex = fbo_get_depth_texture(vfb->fbo_dx9); + LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)fbo_get_api_texture(vfb->fbo_dx9, FB_DEPTH_BIT, 0); if (tex) { D3DSURFACE_DESC desc; D3DLOCKED_RECT locked; @@ -1320,8 +1320,7 @@ namespace DX9 { buffer = GPUDebugBuffer(Memory::GetPointer(fb_address | 0x04000000), fb_stride, 512, fb_format); return true; } - - LPDIRECT3DSURFACE9 renderTarget = vfb->fbo_dx9 ? fbo_get_color_for_read(vfb->fbo_dx9) : nullptr; + LPDIRECT3DSURFACE9 renderTarget = vfb->fbo_dx9 ? (LPDIRECT3DSURFACE9)fbo_get_api_texture(vfb->fbo_dx9, FB_COLOR_BIT | FB_SURFACE_BIT, 0) : nullptr; bool success = false; if (renderTarget) { FBO_DX9 *tempFBO = nullptr; @@ -1333,7 +1332,7 @@ namespace DX9 { h = vfb->height * maxRes; tempFBO = fbo_create(w, h, 1, false); if (SUCCEEDED(fbo_blit(vfb->fbo_dx9, 0, 0, vfb->renderWidth, vfb->renderHeight, tempFBO, 0, 0, w, h, FB_COLOR_BIT, g_Config.iBufFilter == SCALE_LINEAR ? FB_BLIT_LINEAR : FB_BLIT_NEAREST))) { - renderTarget = fbo_get_color_for_read(tempFBO); + renderTarget = (LPDIRECT3DSURFACE9)fbo_get_api_texture(tempFBO, FB_COLOR_BIT | FB_SURFACE_BIT, 0); } } @@ -1412,7 +1411,7 @@ namespace DX9 { } bool success = false; - LPDIRECT3DTEXTURE9 tex = fbo_get_depth_texture(vfb->fbo_dx9); + LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)fbo_get_api_texture(vfb->fbo_dx9, FB_DEPTH_BIT, 0); if (tex) { D3DSURFACE_DESC desc; D3DLOCKED_RECT locked; @@ -1456,7 +1455,7 @@ namespace DX9 { } bool success = false; - LPDIRECT3DTEXTURE9 tex = fbo_get_depth_texture(vfb->fbo_dx9); + LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)fbo_get_api_texture(vfb->fbo_dx9, FB_DEPTH_BIT, 0); if (tex) { D3DSURFACE_DESC desc; D3DLOCKED_RECT locked; diff --git a/GPU/Directx9/helper/dx_fbo.cpp b/GPU/Directx9/helper/dx_fbo.cpp index a63381047..4407c97a0 100644 --- a/GPU/Directx9/helper/dx_fbo.cpp +++ b/GPU/Directx9/helper/dx_fbo.cpp @@ -134,13 +134,28 @@ void fbo_bind_as_render_target(FBO_DX9 *fbo) { dxstate.viewport.restore(); } - -LPDIRECT3DTEXTURE9 fbo_get_color_texture(FBO_DX9 *fbo) { - return fbo->tex; -} - -LPDIRECT3DTEXTURE9 fbo_get_depth_texture(FBO_DX9 *fbo) { - return fbo->depthstenciltex; +uintptr_t fbo_get_api_texture(FBO_DX9 *fbo, int channelBits, int attachment) { + if (channelBits & FB_SURFACE_BIT) { + switch (channelBits & 7) { + case FB_DEPTH_BIT: + return (uintptr_t)fbo->depthstencil; + case FB_STENCIL_BIT: + return (uintptr_t)fbo->depthstencil; + case FB_COLOR_BIT: + default: + return (uintptr_t)fbo->surf; + } + } else { + switch (channelBits & 7) { + case FB_DEPTH_BIT: + return (uintptr_t)fbo->depthstenciltex; + case FB_STENCIL_BIT: + return 0; // Can't texture from stencil + case FB_COLOR_BIT: + default: + return (uintptr_t)fbo->tex; + } + } } LPDIRECT3DSURFACE9 fbo_get_color_for_read(FBO_DX9 *fbo) { diff --git a/GPU/Directx9/helper/dx_fbo.h b/GPU/Directx9/helper/dx_fbo.h index 8772495e8..3abf73d81 100644 --- a/GPU/Directx9/helper/dx_fbo.h +++ b/GPU/Directx9/helper/dx_fbo.h @@ -36,6 +36,8 @@ enum FBOChannel { FB_COLOR_BIT = 1, FB_DEPTH_BIT = 2, FB_STENCIL_BIT = 4, + + FB_SURFACE_BIT = 32, }; enum FBBlitFilter { @@ -59,13 +61,12 @@ bool fbo_blit(FBO_DX9 *src, int srcX1, int srcY1, int srcX2, int srcY2, FBO_DX9 void fbo_bind_as_render_target(FBO_DX9 *fbo); // color must be 0. void fbo_bind_as_texture(FBO_DX9 *fbo, int binding, FBOChannel channelBit, int color); -LPDIRECT3DSURFACE9 fbo_get_color_for_read(FBO_DX9 *fbo); void fbo_bind_backbuffer_as_render_target(); void fbo_get_dimensions(FBO_DX9 *fbo, int *w, int *h); void fbo_resolve(FBO_DX9 *fbo); -LPDIRECT3DTEXTURE9 fbo_get_color_texture(FBO_DX9 *fbo); -LPDIRECT3DTEXTURE9 fbo_get_depth_texture(FBO_DX9 *fbo); +// Escape route until we complete the API +uintptr_t fbo_get_api_texture(FBO_DX9 *fbo, int channelBits, int attachment); // To get default depth and rt surface void fbo_init(LPDIRECT3D9 d3d); diff --git a/GPU/GLES/FBO.cpp b/GPU/GLES/FBO.cpp index f31700be3..f96592eff 100644 --- a/GPU/GLES/FBO.cpp +++ b/GPU/GLES/FBO.cpp @@ -381,6 +381,11 @@ void fbo_blit(FBO *src, int srcX1, int srcY1, int srcX2, int srcY2, FBO *dst, in } } +uintptr_t fbo_get_api_texture(FBO *fbo, FBOChannel channelBit, int attachment) { + // Unimplemented + return 0; +} + void fbo_bind_as_texture(FBO *fbo, int binding, FBOChannel channelBit, int color) { // glActiveTexture(GL_TEXTURE0 + binding); switch (channelBit) { diff --git a/GPU/GLES/FBO.h b/GPU/GLES/FBO.h index 25bb83a92..b339c6798 100644 --- a/GPU/GLES/FBO.h +++ b/GPU/GLES/FBO.h @@ -66,5 +66,6 @@ void fbo_bind_as_texture(FBO *fbo, int binding, FBOChannel channelBit, int attac void fbo_bind_for_read(FBO *fbo); void fbo_bind_backbuffer_as_render_target(); +uintptr_t fbo_get_api_texture(FBO *fbo, FBOChannel channelBit, int attachment); void fbo_get_dimensions(FBO *fbo, int *w, int *h);