mirror of
https://github.com/libretro/ppsspp.git
synced 2025-02-21 09:21:02 +00:00
Add escape route for some more esoteric FBO functionality
This commit is contained in:
parent
f4c3f884e9
commit
bec2921aca
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user