Add PBO callback functions

This commit is contained in:
twinaphex 2017-11-08 18:22:05 +01:00
parent 7c6377a7fa
commit d6cc447aa0
3 changed files with 60 additions and 25 deletions

View File

@ -927,7 +927,8 @@ static void gl_pbo_async_readback(gl_t *gl)
GLenum type = GL_UNSIGNED_INT_8_8_8_8_REV;
#endif
glBindBuffer(GL_PIXEL_PACK_BUFFER,
if (gl->renderchain_driver->bind_pbo)
gl->renderchain_driver->bind_pbo(
gl->pbo_readback[gl->pbo_readback_index++]);
gl->pbo_readback_index &= 3;
@ -942,7 +943,8 @@ static void gl_pbo_async_readback(gl_t *gl)
glReadPixels(gl->vp.x, gl->vp.y,
gl->vp.width, gl->vp.height,
fmt, type, NULL);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
if (gl->renderchain_driver->unbind_pbo)
gl->renderchain_driver->unbind_pbo();
}
#endif
@ -978,7 +980,8 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info)
gl->coords.color = color;
glBindTexture(GL_TEXTURE_2D, gl->menu_texture);
video_info->cb_shader_use(gl, video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true);
video_info->cb_shader_use(gl,
video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true);
gl->coords.vertices = 4;
@ -987,7 +990,8 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info)
video_shader_driver_set_coords(coords);
video_info->cb_shader_set_mvp(gl, video_info->shader_data, &gl->mvp_no_rot);
video_info->cb_shader_set_mvp(gl,
video_info->shader_data, &gl->mvp_no_rot);
glEnable(GL_BLEND);
@ -1542,12 +1546,14 @@ static bool gl_init_pbo_readback(gl_t *gl)
glGenBuffers(4, gl->pbo_readback);
for (i = 0; i < 4; i++)
{
glBindBuffer(GL_PIXEL_PACK_BUFFER, gl->pbo_readback[i]);
glBufferData(GL_PIXEL_PACK_BUFFER, gl->vp.width *
gl->vp.height * sizeof(uint32_t),
NULL, GL_STREAM_READ);
if (gl->renderchain_driver->bind_pbo)
gl->renderchain_driver->bind_pbo(gl->pbo_readback[i]);
if (gl->renderchain_driver->init_pbo)
gl->renderchain_driver->init_pbo(gl->vp.width *
gl->vp.height * sizeof(uint32_t), NULL);
}
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
if (gl->renderchain_driver->unbind_pbo)
gl->renderchain_driver->unbind_pbo();
#ifndef HAVE_OPENGLES3
{

View File

@ -1342,7 +1342,33 @@ static void gl2_renderchain_copy_frame(
#endif
}
static void gl2_renderchain_bind_pbo(unsigned idx)
{
#ifndef HAVE_OPENGLES2
glBindBuffer(GL_PIXEL_PACK_BUFFER, (GLuint)idx);
#endif
}
static void gl2_renderchain_unbind_pbo(void)
{
#ifndef HAVE_OPENGLES2
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
#endif
}
static void gl2_renderchain_init_pbo(unsigned size,
const void *data)
{
#ifndef HAVE_OPENGLES2
glBufferData(GL_PIXEL_PACK_BUFFER, size,
(const GLvoid*)data, GL_STREAM_READ);
#endif
}
gl_renderchain_driver_t gl2_renderchain = {
gl2_renderchain_init_pbo,
gl2_renderchain_bind_pbo,
gl2_renderchain_unbind_pbo,
gl2_renderchain_copy_frame,
gl2_renderchain_restore_default_state,
#ifdef HAVE_OPENGLES

View File

@ -827,6 +827,9 @@ typedef struct d3d_renderchain_driver
typedef struct gl_renderchain_driver
{
void (*init_pbo)(unsigned size, const void *data);
void (*bind_pbo)(unsigned idx);
void (*unbind_pbo)(void);
void (*copy_frame)(
void *data,
video_frame_info_t *video_info,