(OpenGL ES) Pack texture rows manually instead of making multiple calls to glTexSubImage2D.

This commit is contained in:
meancoot 2012-12-07 02:00:46 -05:00
parent 3a85a68230
commit 95fa37b178
2 changed files with 29 additions and 5 deletions

View File

@ -997,13 +997,27 @@ static inline void gl_copy_frame(gl_t *gl, const void *frame, unsigned width, un
}
else // Slower path.
{
const uint8_t *src = (const uint8_t*)frame;
for (unsigned h = 0; h < height; h++, src += pitch)
const unsigned frame_bytes = width * height * gl->base_size;
const unsigned line_bytes = width * gl->base_size;
if(gl->tex_pack_buf_size < frame_bytes)
{
glTexSubImage2D(GL_TEXTURE_2D,
0, 0, h, width, 1, gl->texture_type,
gl->texture_fmt, src);
free(gl->tex_pack_buf);
gl->tex_pack_buf = malloc(frame_bytes);
gl->tex_pack_buf_size = frame_bytes;
}
uint8_t* dst = gl->tex_pack_buf;
const uint8_t *src = (const uint8_t*)frame;
for (unsigned h = 0; h < height; h++, src += pitch, dst += line_bytes)
{
memcpy(dst, src, line_bytes);
}
glTexSubImage2D(GL_TEXTURE_2D,
0, 0, 0, width, height, gl->texture_type,
gl->texture_fmt, gl->tex_pack_buf);
}
}
#else
@ -1248,6 +1262,10 @@ static void gl_free(void *data)
free(gl->empty_buf);
free(gl->conv_buffer);
#if defined(HAVE_OPENGLES)
free(gl->tex_pack_buf);
#endif
free(gl);
}

View File

@ -292,6 +292,12 @@ typedef struct gl
unsigned pbo_readback_index;
struct scaler_ctx pbo_readback_scaler;
#endif
#if defined(HAVE_OPENGLES)
uint8_t* tex_pack_buf;
unsigned tex_pack_buf_size;
#endif
} gl_t;
// Windows ... <_<