gsdx-ogl: optimize GPU->CPU memory transfer size

Might help for snow engine game (a little)

Previous code use to read the full texture whereas now it will be limited
to the size of the useful data.
This commit is contained in:
Gregory Hainaut 2016-03-18 19:26:43 +01:00
parent 490cb757bf
commit da741e294e
2 changed files with 8 additions and 2 deletions

View File

@ -83,8 +83,9 @@ void GSTextureCacheOGL::Read(Target* t, const GSVector4i& r)
if(GSTexture* offscreen = m_renderer->m_dev->CopyOffscreen(t->m_texture, src, r.width(), r.height(), fmt, ps_shader))
{
GSTexture::GSMap m;
GSVector4i r_offscreen(0, 0, r.width(), r.height());
if(offscreen->Map(m))
if(offscreen->Map(m, &r_offscreen))
{
// TODO: block level write

View File

@ -396,6 +396,7 @@ bool GSTextureOGL::Map(GSMap& m, const GSVector4i* r)
#if 0
// Maybe it is as good as the code below. I don't know
// With openGL 4.5 you can use glGetTextureSubImage
glGetTextureImage(m_texture_id, GL_TEX_LEVEL_0, m_int_format, m_int_type, 1024*1024*16, m_local_buffer);
@ -406,7 +407,11 @@ bool GSTextureOGL::Map(GSMap& m, const GSVector4i* r)
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_texture_id, 0);
glPixelStorei(GL_PACK_ALIGNMENT, m_int_alignment);
glReadPixels(0, 0, m_size.x, m_size.y, m_int_format, m_int_type, m_local_buffer);
if (r)
glReadPixels(r->x, r->y, r->width(), r->height(), m_int_format, m_int_type, m_local_buffer);
else
glReadPixels(0, 0, m_size.x, m_size.y, m_int_format, m_int_type, m_local_buffer);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
#endif