mirror of
https://github.com/libretro/RetroArch
synced 2025-03-01 16:13:40 +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;
|
GLenum type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
||||||
#endif
|
#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[gl->pbo_readback_index++]);
|
||||||
gl->pbo_readback_index &= 3;
|
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,
|
glReadPixels(gl->vp.x, gl->vp.y,
|
||||||
gl->vp.width, gl->vp.height,
|
gl->vp.width, gl->vp.height,
|
||||||
fmt, type, NULL);
|
fmt, type, NULL);
|
||||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
if (gl->renderchain_driver->unbind_pbo)
|
||||||
|
gl->renderchain_driver->unbind_pbo();
|
||||||
}
|
}
|
||||||
#endif
|
#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 width = video_info->width;
|
||||||
unsigned height = video_info->height;
|
unsigned height = video_info->height;
|
||||||
|
|
||||||
color[ 0] = 1.0f;
|
color[ 0] = 1.0f;
|
||||||
color[ 1] = 1.0f;
|
color[ 1] = 1.0f;
|
||||||
color[ 2] = 1.0f;
|
color[ 2] = 1.0f;
|
||||||
color[ 3] = gl->menu_texture_alpha;
|
color[ 3] = gl->menu_texture_alpha;
|
||||||
color[ 4] = 1.0f;
|
color[ 4] = 1.0f;
|
||||||
color[ 5] = 1.0f;
|
color[ 5] = 1.0f;
|
||||||
color[ 6] = 1.0f;
|
color[ 6] = 1.0f;
|
||||||
color[ 7] = gl->menu_texture_alpha;
|
color[ 7] = gl->menu_texture_alpha;
|
||||||
color[ 8] = 1.0f;
|
color[ 8] = 1.0f;
|
||||||
color[ 9] = 1.0f;
|
color[ 9] = 1.0f;
|
||||||
color[10] = 1.0f;
|
color[10] = 1.0f;
|
||||||
color[11] = gl->menu_texture_alpha;
|
color[11] = gl->menu_texture_alpha;
|
||||||
color[12] = 1.0f;
|
color[12] = 1.0f;
|
||||||
color[13] = 1.0f;
|
color[13] = 1.0f;
|
||||||
color[14] = 1.0f;
|
color[14] = 1.0f;
|
||||||
color[15] = gl->menu_texture_alpha;
|
color[15] = gl->menu_texture_alpha;
|
||||||
|
|
||||||
if (!gl->menu_texture)
|
if (!gl->menu_texture)
|
||||||
return;
|
return;
|
||||||
@ -978,7 +980,8 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info)
|
|||||||
gl->coords.color = color;
|
gl->coords.color = color;
|
||||||
glBindTexture(GL_TEXTURE_2D, gl->menu_texture);
|
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;
|
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_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);
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
@ -1542,12 +1546,14 @@ static bool gl_init_pbo_readback(gl_t *gl)
|
|||||||
glGenBuffers(4, gl->pbo_readback);
|
glGenBuffers(4, gl->pbo_readback);
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, gl->pbo_readback[i]);
|
if (gl->renderchain_driver->bind_pbo)
|
||||||
glBufferData(GL_PIXEL_PACK_BUFFER, gl->vp.width *
|
gl->renderchain_driver->bind_pbo(gl->pbo_readback[i]);
|
||||||
gl->vp.height * sizeof(uint32_t),
|
if (gl->renderchain_driver->init_pbo)
|
||||||
NULL, GL_STREAM_READ);
|
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
|
#ifndef HAVE_OPENGLES3
|
||||||
{
|
{
|
||||||
|
@ -1342,7 +1342,33 @@ static void gl2_renderchain_copy_frame(
|
|||||||
#endif
|
#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 = {
|
gl_renderchain_driver_t gl2_renderchain = {
|
||||||
|
gl2_renderchain_init_pbo,
|
||||||
|
gl2_renderchain_bind_pbo,
|
||||||
|
gl2_renderchain_unbind_pbo,
|
||||||
gl2_renderchain_copy_frame,
|
gl2_renderchain_copy_frame,
|
||||||
gl2_renderchain_restore_default_state,
|
gl2_renderchain_restore_default_state,
|
||||||
#ifdef HAVE_OPENGLES
|
#ifdef HAVE_OPENGLES
|
||||||
|
@ -827,6 +827,9 @@ typedef struct d3d_renderchain_driver
|
|||||||
|
|
||||||
typedef struct gl_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 (*copy_frame)(
|
||||||
void *data,
|
void *data,
|
||||||
video_frame_info_t *video_info,
|
video_frame_info_t *video_info,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user