RSX : fix opengl error 0x505

This commit is contained in:
raven02 2014-08-03 14:31:59 +08:00 committed by Alexandro Sánchez Bach
commit 7f5cc96842
3 changed files with 20 additions and 22 deletions

View file

@ -442,7 +442,7 @@ void GLGSRender::WriteBuffers()
if (Ini.GSDumpDepthBuffer.GetValue()) if (Ini.GSDumpDepthBuffer.GetValue())
{ {
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[4]); 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); glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_width * RSXThread::m_height * 4, 0, GL_STREAM_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
WriteDepthBuffer(); WriteDepthBuffer();
} }
@ -468,12 +468,12 @@ void GLGSRender::WriteDepthBuffer()
} }
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[4]); glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[4]);
checkForGlError("WriteDepthBuffer(): glBindBuffer"); checkForGlError("WriteDepthBuffer(): glBindBuffer");
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0); glReadPixels(0, 0, RSXThread::m_width, RSXThread::m_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);
if (packed) if (packed)
{ {
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4); memcpy(&Memory[address], packed, RSXThread::m_width * RSXThread::m_height * 4);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
checkForGlError("WriteDepthBuffer(): glUnmapBuffer"); checkForGlError("WriteDepthBuffer(): glUnmapBuffer");
} }
@ -482,7 +482,7 @@ void GLGSRender::WriteDepthBuffer()
checkForGlError("WriteDepthBuffer(): glReadPixels"); 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_width, RSXThread::m_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &Memory[address]);
checkForGlError("WriteDepthBuffer(): glTexImage2D"); checkForGlError("WriteDepthBuffer(): glTexImage2D");
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, &Memory[address]); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, &Memory[address]);
checkForGlError("WriteDepthBuffer(): glGetTexImage"); checkForGlError("WriteDepthBuffer(): glGetTexImage");
@ -506,12 +506,12 @@ void GLGSRender::WriteColorBufferA()
checkForGlError("WriteColorBufferA(): glReadBuffer"); 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");
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_width, RSXThread::m_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);
if (packed) if (packed)
{ {
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4); memcpy(&Memory[address], packed, RSXThread::m_width * RSXThread::m_height * 4);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
checkForGlError("WriteColorBufferA(): glUnmapBuffer"); checkForGlError("WriteColorBufferA(): glUnmapBuffer");
} }
@ -537,12 +537,12 @@ void GLGSRender::WriteColorBufferB()
checkForGlError("WriteColorBufferB(): glReadBuffer"); 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");
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_width, RSXThread::m_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);
if (packed) if (packed)
{ {
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4); memcpy(&Memory[address], packed, RSXThread::m_width * RSXThread::m_height * 4);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
checkForGlError("WriteColorBufferB(): glUnmapBuffer"); checkForGlError("WriteColorBufferB(): glUnmapBuffer");
} }
@ -568,12 +568,12 @@ void GLGSRender::WriteColorBufferC()
checkForGlError("WriteColorBufferC(): glReadBuffer"); 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");
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_width, RSXThread::m_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);
if (packed) if (packed)
{ {
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4); memcpy(&Memory[address], packed, RSXThread::m_width * RSXThread::m_height * 4);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
checkForGlError("WriteColorBufferC(): glUnmapBuffer"); checkForGlError("WriteColorBufferC(): glUnmapBuffer");
} }
@ -599,12 +599,12 @@ void GLGSRender::WriteColorBufferD()
checkForGlError("WriteColorBufferD(): glReadBuffer"); 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");
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_width, RSXThread::m_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);
if (packed) if (packed)
{ {
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4); memcpy(&Memory[address], packed, RSXThread::m_width * RSXThread::m_height * 4);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
checkForGlError("WriteColorBufferD(): glUnmapBuffer"); checkForGlError("WriteColorBufferD(): glUnmapBuffer");
} }
@ -625,14 +625,14 @@ void GLGSRender::WriteColorBuffers()
case CELL_GCM_SURFACE_TARGET_0: case CELL_GCM_SURFACE_TARGET_0:
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[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); glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_width * RSXThread::m_height * 4, 0, GL_STREAM_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); 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]); 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); glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_width * RSXThread::m_height * 4, 0, GL_STREAM_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
WriteColorBufferB(); WriteColorBufferB();
break; break;
@ -641,7 +641,7 @@ void GLGSRender::WriteColorBuffers()
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[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); glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_width * RSXThread::m_height * 4, 0, GL_STREAM_READ);
} }
WriteColorBufferA(); WriteColorBufferA();
WriteColorBufferB(); WriteColorBufferB();
@ -651,7 +651,7 @@ void GLGSRender::WriteColorBuffers()
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
{ {
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[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); glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_width * RSXThread::m_height * 4, 0, GL_STREAM_READ);
} }
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
WriteColorBufferA(); WriteColorBufferA();
@ -663,7 +663,7 @@ void GLGSRender::WriteColorBuffers()
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[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); glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_width * RSXThread::m_height * 4, 0, GL_STREAM_READ);
} }
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
WriteColorBufferA(); WriteColorBufferA();

View file

@ -1321,11 +1321,11 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t args, const u32
} }
gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(m_gcm_buffers_addr); gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(m_gcm_buffers_addr);
m_width = m_buffer_width = re(buffers[m_gcm_current_buffer].width); m_width = re(buffers[m_gcm_current_buffer].width);
m_height = m_buffer_height = re(buffers[m_gcm_current_buffer].height); m_height = re(buffers[m_gcm_current_buffer].height);
// Rescale native resolution to fit 1080p/720p/480p/576p window size // Rescale native resolution to fit 1080p/720p/480p/576p window size
nativeRescale((float)m_buffer_width, (float)m_buffer_height); nativeRescale((float)m_width, (float)m_height);
} }
break; break;

View file

@ -141,8 +141,6 @@ public:
u32 m_width; u32 m_width;
u32 m_height; u32 m_height;
u32 m_buffer_width;
u32 m_buffer_height;
float m_width_scale; float m_width_scale;
float m_height_scale; float m_height_scale;
u32 m_draw_array_count; u32 m_draw_array_count;