mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-16 17:43:11 +00:00
Merge pull request #361 from raven02/patch-4
RSX: asynchronous glReadPixels with PBO for writing color/depth buffers
This commit is contained in:
commit
77e11d670a
@ -17,6 +17,9 @@
|
|||||||
gcmBuffer gcmBuffers[8];
|
gcmBuffer gcmBuffers[8];
|
||||||
GLuint g_flip_tex;
|
GLuint g_flip_tex;
|
||||||
GLuint g_depth_tex;
|
GLuint g_depth_tex;
|
||||||
|
GLuint g_color_pbo[4];
|
||||||
|
GLuint g_depth_pbo;
|
||||||
|
|
||||||
|
|
||||||
int last_width = 0, last_height = 0, last_depth_format = 0;
|
int last_width = 0, last_height = 0, last_depth_format = 0;
|
||||||
|
|
||||||
@ -452,14 +455,21 @@ void GLGSRender::WriteDepthBuffer()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, &Memory[address]);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_depth_pbo);
|
||||||
checkForGlError("glReadPixels");
|
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_DYNAMIC_READ);
|
||||||
|
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
|
||||||
|
checkForGlError("WriteDepthBuffer(): glReadPixels(GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE)");
|
||||||
|
GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
|
||||||
|
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4);
|
||||||
|
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
|
||||||
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
||||||
|
|
||||||
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("glTexImage2D");
|
checkForGlError("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("glGetTexImage");
|
checkForGlError("glGetTexImage");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGSRender::WriteColourBufferA()
|
void GLGSRender::WriteColourBufferA()
|
||||||
@ -480,9 +490,15 @@ void GLGSRender::WriteColourBufferA()
|
|||||||
}
|
}
|
||||||
|
|
||||||
glReadBuffer(GL_COLOR_ATTACHMENT0);
|
glReadBuffer(GL_COLOR_ATTACHMENT0);
|
||||||
checkForGlError("glReadBuffer(GL_COLOR_ATTACHMENT0)");
|
checkForGlError("WriteColourBufferA(): glReadBuffer(GL_COLOR_ATTACHMENT0)");
|
||||||
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, &Memory[address]);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_color_pbo[0]);
|
||||||
checkForGlError("glReadPixels(GL_RGBA, GL_UNSIGNED_INT_8_8_8_8)");
|
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
|
||||||
|
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0);
|
||||||
|
checkForGlError("WriteColourBufferA(): glReadPixels(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8)");
|
||||||
|
GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
|
||||||
|
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4);
|
||||||
|
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
|
||||||
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGSRender::WriteColourBufferB()
|
void GLGSRender::WriteColourBufferB()
|
||||||
@ -503,9 +519,16 @@ void GLGSRender::WriteColourBufferB()
|
|||||||
}
|
}
|
||||||
|
|
||||||
glReadBuffer(GL_COLOR_ATTACHMENT1);
|
glReadBuffer(GL_COLOR_ATTACHMENT1);
|
||||||
checkForGlError("glReadBuffer(GL_COLOR_ATTACHMENT1)");
|
checkForGlError("WriteColourBufferB(): glReadBuffer(GL_COLOR_ATTACHMENT1)");
|
||||||
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, &Memory[address]);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_color_pbo[1]);
|
||||||
checkForGlError("glReadPixels(GL_RGBA, GL_UNSIGNED_INT_8_8_8_8)");
|
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
|
||||||
|
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0);
|
||||||
|
checkForGlError("WriteColourBufferB(): glReadPixels(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8)");
|
||||||
|
GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
|
||||||
|
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4);
|
||||||
|
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
|
||||||
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGSRender::WriteColourBufferC()
|
void GLGSRender::WriteColourBufferC()
|
||||||
@ -526,9 +549,15 @@ void GLGSRender::WriteColourBufferC()
|
|||||||
}
|
}
|
||||||
|
|
||||||
glReadBuffer(GL_COLOR_ATTACHMENT2);
|
glReadBuffer(GL_COLOR_ATTACHMENT2);
|
||||||
checkForGlError("glReadBuffer(GL_COLOR_ATTACHMENT2)");
|
checkForGlError("WriteColourBufferC(): glReadBuffer(GL_COLOR_ATTACHMENT2)");
|
||||||
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, &Memory[address]);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_color_pbo[2]);
|
||||||
checkForGlError("glReadPixels(GL_RGBA, GL_UNSIGNED_INT_8_8_8_8)");
|
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
|
||||||
|
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0);
|
||||||
|
checkForGlError("WriteColourBufferC(): glReadPixels(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8)");
|
||||||
|
GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
|
||||||
|
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4);
|
||||||
|
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
|
||||||
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGSRender::WriteColourBufferD()
|
void GLGSRender::WriteColourBufferD()
|
||||||
@ -549,9 +578,16 @@ void GLGSRender::WriteColourBufferD()
|
|||||||
}
|
}
|
||||||
|
|
||||||
glReadBuffer(GL_COLOR_ATTACHMENT3);
|
glReadBuffer(GL_COLOR_ATTACHMENT3);
|
||||||
checkForGlError("glReadBuffer(GL_COLOR_ATTACHMENT3)");
|
checkForGlError("WriteColourBufferD(): glReadBuffer(GL_COLOR_ATTACHMENT3)");
|
||||||
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, &Memory[address]);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, g_color_pbo[3]);
|
||||||
checkForGlError("glReadPixels(GL_RGBA, GL_UNSIGNED_INT_8_8_8_8)");
|
glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4, 0, GL_STREAM_READ);
|
||||||
|
glReadPixels(0, 0, RSXThread::m_buffer_width, RSXThread::m_buffer_height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, 0);
|
||||||
|
checkForGlError("WriteColourBufferD(): glReadPixels(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8)");
|
||||||
|
GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
|
||||||
|
memcpy(&Memory[address], packed, RSXThread::m_buffer_width * RSXThread::m_buffer_height * 4);
|
||||||
|
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
|
||||||
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGSRender::WriteColorBuffers()
|
void GLGSRender::WriteColorBuffers()
|
||||||
@ -620,6 +656,8 @@ void GLGSRender::OnInitThread()
|
|||||||
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
|
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
|
||||||
glGenTextures(1, &g_depth_tex);
|
glGenTextures(1, &g_depth_tex);
|
||||||
glGenTextures(1, &g_flip_tex);
|
glGenTextures(1, &g_flip_tex);
|
||||||
|
glGenBuffers(4, g_color_pbo);
|
||||||
|
glGenBuffers(1, &g_depth_pbo);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
glSwapInterval(Ini.GSVSyncEnable.GetValue() ? 1 : 0);
|
glSwapInterval(Ini.GSVSyncEnable.GetValue() ? 1 : 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user