mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-25 23:25:41 +00:00
GPU: Fix broken VRAM->CPU transfers at >1x resolution scale
This commit is contained in:
parent
7f8c7aa71c
commit
ebe44ccc0b
|
@ -237,23 +237,32 @@ void GPU_HW_OpenGL::ClearFramebuffer()
|
||||||
|
|
||||||
void GPU_HW_OpenGL::DestroyFramebuffer()
|
void GPU_HW_OpenGL::DestroyFramebuffer()
|
||||||
{
|
{
|
||||||
glDeleteFramebuffers(1, &m_vram_read_fbo);
|
if (m_vram_read_fbo != 0)
|
||||||
m_vram_read_fbo = 0;
|
{
|
||||||
|
glDeleteFramebuffers(1, &m_vram_read_fbo);
|
||||||
|
m_vram_read_fbo = 0;
|
||||||
|
}
|
||||||
m_vram_read_texture.reset();
|
m_vram_read_texture.reset();
|
||||||
|
|
||||||
glDeleteFramebuffers(1, &m_vram_fbo);
|
if (m_vram_fbo != 0)
|
||||||
m_vram_fbo = 0;
|
{
|
||||||
|
glDeleteFramebuffers(1, &m_vram_fbo);
|
||||||
|
m_vram_fbo = 0;
|
||||||
|
}
|
||||||
m_vram_texture.reset();
|
m_vram_texture.reset();
|
||||||
|
|
||||||
if (m_vram_downsample_texture)
|
if (m_vram_downsample_fbo != 0)
|
||||||
{
|
{
|
||||||
glDeleteFramebuffers(1, &m_vram_downsample_fbo);
|
glDeleteFramebuffers(1, &m_vram_downsample_fbo);
|
||||||
m_vram_downsample_fbo = 0;
|
m_vram_downsample_fbo = 0;
|
||||||
m_vram_downsample_texture.reset();
|
|
||||||
}
|
}
|
||||||
|
m_vram_downsample_texture.reset();
|
||||||
|
|
||||||
glDeleteFramebuffers(1, &m_display_fbo);
|
if (m_display_fbo != 0)
|
||||||
m_display_fbo = 0;
|
{
|
||||||
|
glDeleteFramebuffers(1, &m_display_fbo);
|
||||||
|
m_display_fbo = 0;
|
||||||
|
}
|
||||||
m_display_texture.reset();
|
m_display_texture.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,6 +486,7 @@ void GPU_HW_OpenGL::ReadVRAM(u32 x, u32 y, u32 width, u32 height, void* buffer)
|
||||||
{
|
{
|
||||||
// we need to convert RGBA8 -> RGBA5551
|
// we need to convert RGBA8 -> RGBA5551
|
||||||
std::vector<u32> temp_buffer(width * height);
|
std::vector<u32> temp_buffer(width * height);
|
||||||
|
const u32 flipped_y = VRAM_HEIGHT - y - height;
|
||||||
|
|
||||||
// downscaling to 1xIR.
|
// downscaling to 1xIR.
|
||||||
if (m_resolution_scale > 1)
|
if (m_resolution_scale > 1)
|
||||||
|
@ -487,21 +497,22 @@ void GPU_HW_OpenGL::ReadVRAM(u32 x, u32 y, u32 width, u32 height, void* buffer)
|
||||||
const u32 scaled_y = y * m_resolution_scale;
|
const u32 scaled_y = y * m_resolution_scale;
|
||||||
const u32 scaled_width = width * m_resolution_scale;
|
const u32 scaled_width = width * m_resolution_scale;
|
||||||
const u32 scaled_height = height * m_resolution_scale;
|
const u32 scaled_height = height * m_resolution_scale;
|
||||||
|
const u32 scaled_flipped_y = texture_height - scaled_y - scaled_height;
|
||||||
|
|
||||||
glDisable(GL_SCISSOR_TEST);
|
|
||||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_vram_fbo);
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_vram_fbo);
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_vram_downsample_fbo);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_vram_downsample_fbo);
|
||||||
glBlitFramebuffer(scaled_x, texture_height - scaled_y - height, scaled_x + scaled_width, scaled_y + scaled_height,
|
glDisable(GL_SCISSOR_TEST);
|
||||||
0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
glBlitFramebuffer(scaled_x, scaled_flipped_y, scaled_x + scaled_width, scaled_flipped_y + scaled_height, 0, 0,
|
||||||
|
width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||||
|
glEnable(GL_SCISSOR_TEST);
|
||||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_vram_downsample_fbo);
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_vram_downsample_fbo);
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_vram_fbo);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_vram_fbo);
|
||||||
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, temp_buffer.data());
|
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, temp_buffer.data());
|
||||||
glEnable(GL_SCISSOR_TEST);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
glReadPixels(x, flipped_y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, temp_buffer.data());
|
||||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_vram_fbo);
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_vram_fbo);
|
||||||
glReadPixels(x, VRAM_HEIGHT - y - height, width, height, GL_RGBA, GL_UNSIGNED_BYTE, temp_buffer.data());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// reverse copy because of lower-left origin
|
// reverse copy because of lower-left origin
|
||||||
|
|
|
@ -86,15 +86,17 @@ static int Run(int argc, char* argv[])
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
// set log flags
|
// set log flags
|
||||||
g_pLog->SetConsoleOutputParams(true, nullptr, LOGLEVEL_DEBUG);
|
|
||||||
// g_pLog->SetConsoleOutputParams(true, "GPU GPU_HW_OpenGL SPU Pad DigitalController", LOGLEVEL_DEBUG);
|
|
||||||
// g_pLog->SetConsoleOutputParams(true, "GPU GPU_HW_OpenGL SPU Pad DigitalController InterruptController", LOGLEVEL_DEBUG);
|
|
||||||
|
|
||||||
#ifdef Y_BUILD_CONFIG_RELEASE
|
#ifdef Y_BUILD_CONFIG_RELEASE
|
||||||
g_pLog->SetFilterLevel(LOGLEVEL_INFO);
|
const LOGLEVEL level = LOGLEVEL_INFO;
|
||||||
// g_pLog->SetFilterLevel(LOGLEVEL_DEV);
|
// const LOGLEVEL level = LOGLEVEL_DEV;
|
||||||
// g_pLog->SetFilterLevel(LOGLEVEL_PROFILE);
|
// const LOGLEVEL level = LOGLEVEL_PROFILE;
|
||||||
|
// g_pLog->SetConsoleOutputParams(true, nullptr, level);
|
||||||
|
g_pLog->SetConsoleOutputParams(true, "Pad SPU", level);
|
||||||
|
g_pLog->SetFilterLevel(level);
|
||||||
#else
|
#else
|
||||||
|
// g_pLog->SetConsoleOutputParams(true, nullptr, LOGLEVEL_DEBUG);
|
||||||
|
// g_pLog->SetConsoleOutputParams(true, "GPU GPU_HW_OpenGL SPU Pad DigitalController", LOGLEVEL_DEBUG);
|
||||||
|
g_pLog->SetConsoleOutputParams(true, "GPU GPU_HW_OpenGL SPU Pad DigitalController InterruptController", LOGLEVEL_DEBUG);
|
||||||
// g_pLog->SetFilterLevel(LOGLEVEL_TRACE);
|
// g_pLog->SetFilterLevel(LOGLEVEL_TRACE);
|
||||||
g_pLog->SetFilterLevel(LOGLEVEL_DEBUG);
|
g_pLog->SetFilterLevel(LOGLEVEL_DEBUG);
|
||||||
// g_pLog->SetFilterLevel(LOGLEVEL_DEV);
|
// g_pLog->SetFilterLevel(LOGLEVEL_DEV);
|
||||||
|
|
|
@ -108,7 +108,7 @@ bool SDLInterface::CreateGLContext()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// SDL_GL_SetSwapInterval(0);
|
SDL_GL_SetSwapInterval(0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue