mirror of
https://github.com/libretro/RetroArch
synced 2025-03-01 07:13:35 +00:00
Add PBO callback functions
This commit is contained in:
parent
7c6377a7fa
commit
d6cc447aa0
@ -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
|
||||
|
||||
@ -953,22 +955,22 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info)
|
||||
unsigned width = video_info->width;
|
||||
unsigned height = video_info->height;
|
||||
|
||||
color[ 0] = 1.0f;
|
||||
color[ 1] = 1.0f;
|
||||
color[ 2] = 1.0f;
|
||||
color[ 3] = gl->menu_texture_alpha;
|
||||
color[ 4] = 1.0f;
|
||||
color[ 5] = 1.0f;
|
||||
color[ 6] = 1.0f;
|
||||
color[ 7] = gl->menu_texture_alpha;
|
||||
color[ 8] = 1.0f;
|
||||
color[ 9] = 1.0f;
|
||||
color[10] = 1.0f;
|
||||
color[11] = gl->menu_texture_alpha;
|
||||
color[12] = 1.0f;
|
||||
color[13] = 1.0f;
|
||||
color[14] = 1.0f;
|
||||
color[15] = gl->menu_texture_alpha;
|
||||
color[ 0] = 1.0f;
|
||||
color[ 1] = 1.0f;
|
||||
color[ 2] = 1.0f;
|
||||
color[ 3] = gl->menu_texture_alpha;
|
||||
color[ 4] = 1.0f;
|
||||
color[ 5] = 1.0f;
|
||||
color[ 6] = 1.0f;
|
||||
color[ 7] = gl->menu_texture_alpha;
|
||||
color[ 8] = 1.0f;
|
||||
color[ 9] = 1.0f;
|
||||
color[10] = 1.0f;
|
||||
color[11] = gl->menu_texture_alpha;
|
||||
color[12] = 1.0f;
|
||||
color[13] = 1.0f;
|
||||
color[14] = 1.0f;
|
||||
color[15] = gl->menu_texture_alpha;
|
||||
|
||||
if (!gl->menu_texture)
|
||||
return;
|
||||
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user