RSX: cleanup PBO

This commit is contained in:
raven02 2014-07-30 03:33:44 +08:00
parent 08d22a8033
commit 90dd215b8c

View file

@ -15,7 +15,7 @@
#endif #endif
gcmBuffer gcmBuffers[8]; gcmBuffer gcmBuffers[8];
GLuint g_flip_tex, g_depth_tex, g_pbo[6]; GLuint g_flip_tex, g_depth_tex, g_pbo[5];
int last_width = 0, last_height = 0, last_depth_format = 0; int last_width = 0, last_height = 0, last_depth_format = 0;
GLenum g_last_gl_error = GL_NO_ERROR; GLenum g_last_gl_error = GL_NO_ERROR;
@ -441,6 +441,9 @@ void GLGSRender::WriteBuffers()
{ {
if (Ini.GSDumpDepthBuffer.GetValue()) if (Ini.GSDumpDepthBuffer.GetValue())
{ {
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[4]);
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
WriteDepthBuffer(); WriteDepthBuffer();
} }
@ -463,11 +466,8 @@ void GLGSRender::WriteDepthBuffer()
LOG_WARNING(RSX, "Bad depth buffer address: address=0x%x, offset=0x%x, dma=0x%x", address, m_surface_offset_z, m_context_dma_z); LOG_WARNING(RSX, "Bad depth buffer address: address=0x%x, offset=0x%x, dma=0x%x", address, m_surface_offset_z, m_context_dma_z);
return; return;
} }
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[4]);
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[5]);
checkForGlError("WriteDepthBuffer(): glBindBuffer"); checkForGlError("WriteDepthBuffer(): glBindBuffer");
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_DYNAMIC_READ);
checkForGlError("WriteDepthBuffer(): glBufferData");
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0); glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
checkForGlError("WriteDepthBuffer(): glReadPixels"); checkForGlError("WriteDepthBuffer(): glReadPixels");
GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
@ -477,9 +477,10 @@ void GLGSRender::WriteDepthBuffer()
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
checkForGlError("WriteDepthBuffer(): glUnmapBuffer"); checkForGlError("WriteDepthBuffer(): glUnmapBuffer");
} }
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
checkForGlError("WriteDepthBuffer(): glBindBuffer");
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
checkForGlError("WriteDepthBuffer(): glReadPixels");
glBindTexture(GL_TEXTURE_2D, g_depth_tex); glBindTexture(GL_TEXTURE_2D, g_depth_tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, RSXThread::m_buffer_width, RSXThread::m_buffer_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &Memory[address]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, RSXThread::m_buffer_width, RSXThread::m_buffer_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &Memory[address]);
checkForGlError("WriteDepthBuffer(): glTexImage2D"); checkForGlError("WriteDepthBuffer(): glTexImage2D");
@ -502,11 +503,9 @@ void GLGSRender::WriteColorBufferA()
} }
glReadBuffer(GL_COLOR_ATTACHMENT0); glReadBuffer(GL_COLOR_ATTACHMENT0);
checkForGlError("WriteColorBufferA(): glReadBuffer(GL_COLOR_ATTACHMENT0)"); checkForGlError("WriteColorBufferA(): glReadBuffer");
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[0]); glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[0]);
checkForGlError("WriteColorBufferA(): glBindBuffer"); checkForGlError("WriteColorBufferA(): glBindBuffer");
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
checkForGlError("WriteColorBufferA(): glBufferData");
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0); glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0);
checkForGlError("WriteColorBufferA(): glReadPixels"); checkForGlError("WriteColorBufferA(): glReadPixels");
GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
@ -516,8 +515,8 @@ void GLGSRender::WriteColorBufferA()
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
checkForGlError("WriteColorBufferA(): glUnmapBuffer"); checkForGlError("WriteColorBufferA(): glUnmapBuffer");
} }
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
checkForGlError("WriteColorBufferA(): glBindBuffer");
} }
void GLGSRender::WriteColorBufferB() void GLGSRender::WriteColorBufferB()
@ -535,11 +534,9 @@ void GLGSRender::WriteColorBufferB()
} }
glReadBuffer(GL_COLOR_ATTACHMENT1); glReadBuffer(GL_COLOR_ATTACHMENT1);
checkForGlError("WriteColorBufferB(): glReadBuffer(GL_COLOR_ATTACHMENT1)"); checkForGlError("WriteColorBufferB(): glReadBuffer");
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[1]); glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[1]);
checkForGlError("WriteColorBufferB(): glBindBuffer"); checkForGlError("WriteColorBufferB(): glBindBuffer");
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
checkForGlError("WriteColorBufferB(): glBufferData");
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0); glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0);
checkForGlError("WriteColorBufferB(): glReadPixels"); checkForGlError("WriteColorBufferB(): glReadPixels");
GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
@ -549,9 +546,8 @@ void GLGSRender::WriteColorBufferB()
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
checkForGlError("WriteColorBufferB(): glUnmapBuffer"); checkForGlError("WriteColorBufferB(): glUnmapBuffer");
} }
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
checkForGlError("WriteColorBufferB(): glBindBuffer");
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
} }
void GLGSRender::WriteColorBufferC() void GLGSRender::WriteColorBufferC()
@ -569,11 +565,9 @@ void GLGSRender::WriteColorBufferC()
} }
glReadBuffer(GL_COLOR_ATTACHMENT2); glReadBuffer(GL_COLOR_ATTACHMENT2);
checkForGlError("WriteColorBufferC(): glReadBuffer(GL_COLOR_ATTACHMENT2)"); checkForGlError("WriteColorBufferC(): glReadBuffer");
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[2]); glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[2]);
checkForGlError("WriteColorBufferC(): glBindBuffer"); checkForGlError("WriteColorBufferC(): glBindBuffer");
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
checkForGlError("WriteColorBufferC(): glBufferData");
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0); glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0);
checkForGlError("WriteColorBufferC(): glReadPixels"); checkForGlError("WriteColorBufferC(): glReadPixels");
GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
@ -583,8 +577,8 @@ void GLGSRender::WriteColorBufferC()
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
checkForGlError("WriteColorBufferC(): glUnmapBuffer"); checkForGlError("WriteColorBufferC(): glUnmapBuffer");
} }
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
checkForGlError("WriteColorBufferC(): glBindBuffer");
} }
void GLGSRender::WriteColorBufferD() void GLGSRender::WriteColorBufferD()
@ -602,11 +596,9 @@ void GLGSRender::WriteColorBufferD()
} }
glReadBuffer(GL_COLOR_ATTACHMENT3); glReadBuffer(GL_COLOR_ATTACHMENT3);
checkForGlError("WriteColorBufferD(): glReadBuffer(GL_COLOR_ATTACHMENT3)"); checkForGlError("WriteColorBufferD(): glReadBuffer");
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[3]); glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[3]);
checkForGlError("WriteColorBufferD(): glBindBuffer"); checkForGlError("WriteColorBufferD(): glBindBuffer");
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
checkForGlError("WriteColorBufferD(): glBufferData");
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0); glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0);
checkForGlError("WriteColorBufferD(): glReadPixels"); checkForGlError("WriteColorBufferD(): glReadPixels");
GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
@ -615,10 +607,10 @@ void GLGSRender::WriteColorBufferD()
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4); memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
checkForGlError("WriteColorBufferD(): glUnmapBuffer"); checkForGlError("WriteColorBufferD(): glUnmapBuffer");
} }
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
checkForGlError("WriteColorBufferD(): glBindBuffer");
} }
void GLGSRender::WriteColorBuffers() void GLGSRender::WriteColorBuffers()
@ -632,25 +624,48 @@ void GLGSRender::WriteColorBuffers()
return; return;
case CELL_GCM_SURFACE_TARGET_0: case CELL_GCM_SURFACE_TARGET_0:
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[0]);
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
WriteColorBufferA(); WriteColorBufferA();
break; break;
case CELL_GCM_SURFACE_TARGET_1: case CELL_GCM_SURFACE_TARGET_1:
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[1]);
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
WriteColorBufferB(); WriteColorBufferB();
break; break;
case CELL_GCM_SURFACE_TARGET_MRT1: case CELL_GCM_SURFACE_TARGET_MRT1:
for (int i = 0; i < 2; i++)
{
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[i]);
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
}
WriteColorBufferA(); WriteColorBufferA();
WriteColorBufferB(); WriteColorBufferB();
break; break;
case CELL_GCM_SURFACE_TARGET_MRT2: case CELL_GCM_SURFACE_TARGET_MRT2:
for (int i = 0; i < 3; i++)
{
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[i]);
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
}
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
WriteColorBufferA(); WriteColorBufferA();
WriteColorBufferB(); WriteColorBufferB();
WriteColorBufferC(); WriteColorBufferC();
break; break;
case CELL_GCM_SURFACE_TARGET_MRT3: case CELL_GCM_SURFACE_TARGET_MRT3:
for (int i = 0; i < 4; i++)
{
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[i]);
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
}
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
WriteColorBufferA(); WriteColorBufferA();
WriteColorBufferB(); WriteColorBufferB();
WriteColorBufferC(); WriteColorBufferC();
@ -688,7 +703,7 @@ void GLGSRender::OnInitThread()
glGenTextures(1, &g_depth_tex); glGenTextures(1, &g_depth_tex);
glGenTextures(1, &g_flip_tex); glGenTextures(1, &g_flip_tex);
glGenBuffers(6, g_pbo); glGenBuffers(5, g_pbo); // 4 color + 1 depth
#ifdef _WIN32 #ifdef _WIN32
glSwapInterval(Ini.GSVSyncEnable.GetValue() ? 1 : 0); glSwapInterval(Ini.GSVSyncEnable.GetValue() ? 1 : 0);
@ -705,7 +720,7 @@ void GLGSRender::OnExitThread()
{ {
glDeleteTextures(1, &g_flip_tex); glDeleteTextures(1, &g_flip_tex);
glDeleteTextures(1, &g_depth_tex); glDeleteTextures(1, &g_depth_tex);
glDeleteBuffers(6, g_pbo); glDeleteBuffers(5, g_pbo);
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
glDisable(GL_VERTEX_PROGRAM_POINT_SIZE); glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);