Move renderchain driver interface to gl_common.h - and replace

some void pointers in function callbacks with gl_t
This commit is contained in:
twinaphex 2018-05-13 05:53:06 +02:00
parent 3773482883
commit 6996e72b49
4 changed files with 108 additions and 132 deletions

View File

@ -154,6 +154,85 @@ RETRO_BEGIN_DECLS
#endif #endif
#endif #endif
typedef struct gl gl_t;
typedef struct gl_renderchain_driver
{
void (*set_coords)(void *handle_data,
void *chain_data,
void *shader_data, const struct video_coords *coords);
void (*set_mvp)(void *data,
void *chain_data,
void *shader_data,
const void *mat_data);
void (*init_texture_reference)(
gl_t *gl, void *chain_data, unsigned i,
unsigned internal_fmt, unsigned texture_fmt,
unsigned texture_type);
void (*fence_iterate)(void *data, void *chain_data,
unsigned hard_sync_frames);
void (*fence_free)(void *data, void *chain_data);
void (*readback)(gl_t *gl,
void *chain_data,
unsigned alignment,
unsigned fmt, unsigned type,
void *src);
void (*init_pbo)(unsigned size, const void *data);
void (*bind_pbo)(unsigned idx);
void (*unbind_pbo)(void *data, void *chain_data);
void (*copy_frame)(
gl_t *gl,
void *chain_data,
video_frame_info_t *video_info,
const void *frame,
unsigned width, unsigned height, unsigned pitch);
void (*restore_default_state)(gl_t *gl, void *chain_data);
void (*new_vao)(void *data, void *chain_data);
void (*free_vao)(void *data, void *chain_data);
void (*bind_vao)(void *data, void *chain_data);
void (*unbind_vao)(void *data, void *chain_data);
void (*disable_client_arrays)(void *data, void *chain_data);
void (*ff_vertex)(const void *data);
void (*ff_matrix)(const void *data);
void (*bind_backbuffer)(void *data, void *chain_data);
void (*deinit_fbo)(gl_t *gl, void *chain_data);
void (*viewport_info)(
gl_t *gl, void *chain_data, struct video_viewport *vp);
bool (*read_viewport)(
gl_t *gl, void *chain_data, uint8_t *buffer, bool is_idle);
void (*bind_prev_texture)(
gl_t *gl,
void *chain_data,
const struct video_tex_info *tex_info);
void (*chain_free)(void *data, void *chain_data);
void *(*chain_new)(void);
void (*init)(gl_t *gl, void *chain_data,
unsigned fbo_width, unsigned fbo_height);
bool (*init_hw_render)(gl_t *gl, void *chain_data,
unsigned width, unsigned height);
void (*free)(gl_t *gl, void *chain_data);
void (*deinit_hw_render)(gl_t *gl, void *chain_data);
void (*start_render)(gl_t *gl, void *chain_data,
video_frame_info_t *video_info);
void (*check_fbo_dimensions)(gl_t *gl, void *chain_data);
void (*recompute_pass_sizes)(gl_t *gl,
void *chain_data,
unsigned width, unsigned height,
unsigned vp_width, unsigned vp_height);
void (*renderchain_render)(gl_t *gl,
void *chain_data,
video_frame_info_t *video_info,
uint64_t frame_count,
const struct video_tex_info *tex_info,
const struct video_tex_info *feedback_info);
void (*resolve_extensions)(
gl_t *gl,
void *chain_data,
const char *context_ident,
const video_info_t *video);
const char *ident;
} gl_renderchain_driver_t;
typedef struct gl typedef struct gl
{ {
GLenum internal_fmt; GLenum internal_fmt;

View File

@ -56,12 +56,11 @@ typedef struct gl1_renderchain
} gl1_renderchain_t; } gl1_renderchain_t;
static void gl1_renderchain_viewport_info( static void gl1_renderchain_viewport_info(
void *data, void *chain_data, gl_t *gl, void *chain_data,
struct video_viewport *vp) struct video_viewport *vp)
{ {
unsigned width, height; unsigned width, height;
unsigned top_y, top_dist; unsigned top_y, top_dist;
gl_t *gl = (gl_t*)data;
video_driver_get_size(&width, &height); video_driver_get_size(&width, &height);
@ -76,16 +75,10 @@ static void gl1_renderchain_viewport_info(
} }
static bool gl1_renderchain_read_viewport( static bool gl1_renderchain_read_viewport(
void *data, void *chain_data, gl_t *gl, void *chain_data,
uint8_t *buffer, bool is_idle) uint8_t *buffer, bool is_idle)
{ {
unsigned num_pixels = 0; unsigned num_pixels = gl->vp.width * gl->vp.height;
gl_t *gl = (gl_t*)data;
if (!gl)
return false;
num_pixels = gl->vp.width * gl->vp.height;
/* Use slow synchronous readbacks. Use this with plain screenshots /* Use slow synchronous readbacks. Use this with plain screenshots
as we don't really care about performance in this case. */ as we don't really care about performance in this case. */
@ -179,12 +172,12 @@ static void gl1_renderchain_disable_client_arrays(void *data,
glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY);
} }
static void gl1_renderchain_restore_default_state(void *data, static void gl1_renderchain_restore_default_state(gl_t *gl,
void *chain_data) void *chain_data)
{ {
gl_t *gl = (gl_t*)data;
if (!gl) if (!gl)
return; return;
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
@ -192,13 +185,12 @@ static void gl1_renderchain_restore_default_state(void *data,
} }
static void gl1_renderchain_copy_frame( static void gl1_renderchain_copy_frame(
void *data, gl_t *gl,
void *chain_data, void *chain_data,
video_frame_info_t *video_info, video_frame_info_t *video_info,
const void *frame, const void *frame,
unsigned width, unsigned height, unsigned pitch) unsigned width, unsigned height, unsigned pitch)
{ {
gl_t *gl = (gl_t*)data;
const GLvoid *data_buf = frame; const GLvoid *data_buf = frame;
glPixelStorei(GL_UNPACK_ALIGNMENT, video_pixel_get_alignment(pitch)); glPixelStorei(GL_UNPACK_ALIGNMENT, video_pixel_get_alignment(pitch));
@ -228,14 +220,13 @@ static void gl1_renderchain_copy_frame(
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
} }
static void gl1_renderchain_readback(void *data, static void gl1_renderchain_readback(
gl_t *gl,
void *chain_data, void *chain_data,
unsigned alignment, unsigned alignment,
unsigned fmt, unsigned type, unsigned fmt, unsigned type,
void *src) void *src)
{ {
gl_t *gl = (gl_t*)data;
glPixelStorei(GL_PACK_ALIGNMENT, alignment); glPixelStorei(GL_PACK_ALIGNMENT, alignment);
glPixelStorei(GL_PACK_ROW_LENGTH, 0); glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glReadBuffer(GL_BACK); glReadBuffer(GL_BACK);
@ -278,7 +269,7 @@ static void gl1_renderchain_set_coords(void *handle_data,
} }
static void gl1_renderchain_render( static void gl1_renderchain_render(
void *data, gl_t *gl,
void *chain_data, void *chain_data,
video_frame_info_t *video_info, video_frame_info_t *video_info,
uint64_t frame_count, uint64_t frame_count,

View File

@ -296,11 +296,10 @@ static void gl_check_fbo_dimension(gl_t *gl,
/* On resize, we might have to recreate our FBOs /* On resize, we might have to recreate our FBOs
* due to "Viewport" scale, and set a new viewport. */ * due to "Viewport" scale, and set a new viewport. */
static void gl2_renderchain_check_fbo_dimensions(void *data, static void gl2_renderchain_check_fbo_dimensions(
void *chain_data) gl_t *gl, void *chain_data)
{ {
int i; int i;
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
/* Check if we have to recreate our FBO textures. */ /* Check if we have to recreate our FBO textures. */
@ -320,7 +319,7 @@ static void gl2_renderchain_check_fbo_dimensions(void *data,
} }
static void gl2_renderchain_render( static void gl2_renderchain_render(
void *data, gl_t *gl,
void *chain_data, void *chain_data,
video_frame_info_t *video_info, video_frame_info_t *video_info,
uint64_t frame_count, uint64_t frame_count,
@ -331,7 +330,6 @@ static void gl2_renderchain_render(
video_shader_ctx_coords_t coords; video_shader_ctx_coords_t coords;
video_shader_ctx_params_t params; video_shader_ctx_params_t params;
video_shader_ctx_info_t shader_info; video_shader_ctx_info_t shader_info;
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
static GLfloat fbo_tex_coords[8] = {0.0f}; static GLfloat fbo_tex_coords[8] = {0.0f};
struct video_tex_info fbo_tex_info[GFX_MAX_SHADERS]; struct video_tex_info fbo_tex_info[GFX_MAX_SHADERS];
@ -498,10 +496,9 @@ static void gl2_renderchain_render(
gl->coords.tex_coord = gl->tex_info.coord; gl->coords.tex_coord = gl->tex_info.coord;
} }
static void gl2_renderchain_deinit_fbo(void *data, static void gl2_renderchain_deinit_fbo(gl_t *gl,
void *chain_data) void *chain_data)
{ {
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
if (gl) if (gl)
@ -531,10 +528,9 @@ static void gl2_renderchain_deinit_fbo(void *data,
} }
static void gl2_renderchain_deinit_hw_render( static void gl2_renderchain_deinit_hw_render(
void *data, gl_t *gl,
void *chain_data) void *chain_data)
{ {
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
if (!gl) if (!gl)
return; return;
@ -550,10 +546,8 @@ static void gl2_renderchain_deinit_hw_render(
context_bind_hw_render(false); context_bind_hw_render(false);
} }
static void gl2_renderchain_free(void *data, void *chain_data) static void gl2_renderchain_free(gl_t *gl, void *chain_data)
{ {
gl_t *gl = (gl_t*)data;
gl2_renderchain_deinit_fbo(gl, chain_data); gl2_renderchain_deinit_fbo(gl, chain_data);
gl2_renderchain_deinit_hw_render(gl, chain_data); gl2_renderchain_deinit_hw_render(gl, chain_data);
} }
@ -740,13 +734,12 @@ static void gl_create_fbo_textures(gl_t *gl, gl2_renderchain_t *chain)
* we have to recalculate geometry of our FBO. */ * we have to recalculate geometry of our FBO. */
static void gl2_renderchain_recompute_pass_sizes( static void gl2_renderchain_recompute_pass_sizes(
void *data, gl_t *gl,
void *chain_data, void *chain_data,
unsigned width, unsigned height, unsigned width, unsigned height,
unsigned vp_width, unsigned vp_height) unsigned vp_width, unsigned vp_height)
{ {
int i; int i;
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
bool size_modified = false; bool size_modified = false;
GLint max_size = 0; GLint max_size = 0;
@ -804,7 +797,8 @@ static void gl2_renderchain_recompute_pass_sizes(
} }
} }
static void gl2_renderchain_start_render(void *data, static void gl2_renderchain_start_render(
gl_t *gl,
void *chain_data, void *chain_data,
video_frame_info_t *video_info) video_frame_info_t *video_info)
{ {
@ -817,7 +811,6 @@ static void gl2_renderchain_start_render(void *data,
0, 1, 0, 1,
1, 1 1, 1
}; };
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]);
@ -841,7 +834,7 @@ static void gl2_renderchain_start_render(void *data,
/* Set up render to texture. */ /* Set up render to texture. */
void gl2_renderchain_init( void gl2_renderchain_init(
void *data, void *chain_data, gl_t *gl, void *chain_data,
unsigned fbo_width, unsigned fbo_height) unsigned fbo_width, unsigned fbo_height)
{ {
int i; int i;
@ -849,7 +842,6 @@ void gl2_renderchain_init(
video_shader_ctx_scale_t scaler; video_shader_ctx_scale_t scaler;
video_shader_ctx_info_t shader_info; video_shader_ctx_info_t shader_info;
struct gfx_fbo_scale scale, scale_last; struct gfx_fbo_scale scale, scale_last;
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
if (!video_shader_driver_info(&shader_info)) if (!video_shader_driver_info(&shader_info))
@ -951,7 +943,7 @@ void gl2_renderchain_init(
} }
static bool gl2_renderchain_init_hw_render( static bool gl2_renderchain_init_hw_render(
void *data, gl_t *gl,
void *chain_data, void *chain_data,
unsigned width, unsigned height) unsigned width, unsigned height)
{ {
@ -963,7 +955,6 @@ static bool gl2_renderchain_init_hw_render(
GLint max_renderbuffer_size = 0; GLint max_renderbuffer_size = 0;
struct retro_hw_render_callback *hwr = struct retro_hw_render_callback *hwr =
video_driver_get_hw_context(); video_driver_get_hw_context();
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
/* We can only share texture objects through contexts. /* We can only share texture objects through contexts.
@ -1054,11 +1045,10 @@ static bool gl2_renderchain_init_hw_render(
} }
static void gl2_renderchain_bind_prev_texture( static void gl2_renderchain_bind_prev_texture(
void *data, gl_t *gl,
void *chain_data, void *chain_data,
const struct video_tex_info *tex_info) const struct video_tex_info *tex_info)
{ {
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
memmove(gl->prev_info + 1, gl->prev_info, memmove(gl->prev_info + 1, gl->prev_info,
@ -1080,12 +1070,11 @@ static void gl2_renderchain_bind_prev_texture(
} }
static void gl2_renderchain_viewport_info( static void gl2_renderchain_viewport_info(
void *data, void *chain_data, gl_t *gl, void *chain_data,
struct video_viewport *vp) struct video_viewport *vp)
{ {
unsigned width, height; unsigned width, height;
unsigned top_y, top_dist; unsigned top_y, top_dist;
gl_t *gl = (gl_t*)data;
video_driver_get_size(&width, &height); video_driver_get_size(&width, &height);
@ -1100,12 +1089,11 @@ static void gl2_renderchain_viewport_info(
} }
static bool gl2_renderchain_read_viewport( static bool gl2_renderchain_read_viewport(
void *data, gl_t *gl,
void *chain_data, void *chain_data,
uint8_t *buffer, bool is_idle) uint8_t *buffer, bool is_idle)
{ {
unsigned num_pixels = 0; unsigned num_pixels = 0;
gl_t *gl = (gl_t*)data;
if (!gl) if (!gl)
return false; return false;
@ -1258,10 +1246,9 @@ static void gl2_renderchain_free_vao(void *data,
#endif #endif
static void gl2_renderchain_restore_default_state( static void gl2_renderchain_restore_default_state(
void *data, gl_t *gl,
void *chain_data) void *chain_data)
{ {
gl_t *gl = (gl_t*)data;
if (!gl) if (!gl)
return; return;
#ifndef HAVE_OPENGLES #ifndef HAVE_OPENGLES
@ -1274,13 +1261,12 @@ static void gl2_renderchain_restore_default_state(
} }
static void gl2_renderchain_copy_frame( static void gl2_renderchain_copy_frame(
void *data, gl_t *gl,
void *chain_data, void *chain_data,
video_frame_info_t *video_info, video_frame_info_t *video_info,
const void *frame, const void *frame,
unsigned width, unsigned height, unsigned pitch) unsigned width, unsigned height, unsigned pitch)
{ {
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
(void)chain; (void)chain;
@ -1436,14 +1422,13 @@ static void gl2_renderchain_init_pbo(unsigned size,
} }
#endif #endif
static void gl2_renderchain_readback(void *data, static void gl2_renderchain_readback(
gl_t *gl,
void *chain_data, void *chain_data,
unsigned alignment, unsigned alignment,
unsigned fmt, unsigned type, unsigned fmt, unsigned type,
void *src) void *src)
{ {
gl_t *gl = (gl_t*)data;
glPixelStorei(GL_PACK_ALIGNMENT, alignment); glPixelStorei(GL_PACK_ALIGNMENT, alignment);
#ifndef HAVE_OPENGLES #ifndef HAVE_OPENGLES
glPixelStorei(GL_PACK_ROW_LENGTH, 0); glPixelStorei(GL_PACK_ROW_LENGTH, 0);
@ -1499,11 +1484,10 @@ static void gl2_renderchain_fence_free(void *data,
#endif #endif
static void gl2_renderchain_init_textures_reference( static void gl2_renderchain_init_textures_reference(
void *data, void *chain_data, unsigned i, gl_t *gl, void *chain_data, unsigned i,
unsigned internal_fmt, unsigned texture_fmt, unsigned internal_fmt, unsigned texture_fmt,
unsigned texture_type) unsigned texture_type)
{ {
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
(void)chain; (void)chain;
@ -1528,11 +1512,10 @@ static void gl2_renderchain_init_textures_reference(
#endif #endif
} }
static void gl2_renderchain_resolve_extensions(void *data, static void gl2_renderchain_resolve_extensions(gl_t *gl,
void *chain_data, const char *context_ident, void *chain_data, const char *context_ident,
const video_info_t *video) const video_info_t *video)
{ {
gl_t *gl = (gl_t*)data;
gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data;
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();

View File

@ -854,83 +854,6 @@ typedef struct d3d_renderchain_driver
const char *ident; const char *ident;
} d3d_renderchain_driver_t; } d3d_renderchain_driver_t;
typedef struct gl_renderchain_driver
{
void (*set_coords)(void *handle_data,
void *chain_data,
void *shader_data, const struct video_coords *coords);
void (*set_mvp)(void *data,
void *chain_data,
void *shader_data,
const void *mat_data);
void (*init_texture_reference)(
void *data, void *chain_data, unsigned i,
unsigned internal_fmt, unsigned texture_fmt,
unsigned texture_type);
void (*fence_iterate)(void *data, void *chain_data,
unsigned hard_sync_frames);
void (*fence_free)(void *data, void *chain_data);
void (*readback)(void *data,
void *chain_data,
unsigned alignment,
unsigned fmt, unsigned type,
void *src);
void (*init_pbo)(unsigned size, const void *data);
void (*bind_pbo)(unsigned idx);
void (*unbind_pbo)(void *data, void *chain_data);
void (*copy_frame)(
void *data,
void *chain_data,
video_frame_info_t *video_info,
const void *frame,
unsigned width, unsigned height, unsigned pitch);
void (*restore_default_state)(void *data, void *chain_data);
void (*new_vao)(void *data, void *chain_data);
void (*free_vao)(void *data, void *chain_data);
void (*bind_vao)(void *data, void *chain_data);
void (*unbind_vao)(void *data, void *chain_data);
void (*disable_client_arrays)(void *data, void *chain_data);
void (*ff_vertex)(const void *data);
void (*ff_matrix)(const void *data);
void (*bind_backbuffer)(void *data, void *chain_data);
void (*deinit_fbo)(void *data, void *chain_data);
void (*viewport_info)(
void *data, void *chain_data, struct video_viewport *vp);
bool (*read_viewport)(
void *data, void *chain_data, uint8_t *buffer, bool is_idle);
void (*bind_prev_texture)(
void *data,
void *chain_data,
const struct video_tex_info *tex_info);
void (*chain_free)(void *data, void *chain_data);
void *(*chain_new)(void);
void (*init)(void *data, void *chain_data,
unsigned fbo_width, unsigned fbo_height);
bool (*init_hw_render)(void *data, void *chain_data,
unsigned width, unsigned height);
void (*free)(void *data, void *chain_data);
void (*deinit_hw_render)(void *data, void *chain_data);
void (*start_render)(void *data, void *chain_data,
video_frame_info_t *video_info);
void (*check_fbo_dimensions)(void *data, void *chain_data);
void (*recompute_pass_sizes)(void *data,
void *chain_data,
unsigned width, unsigned height,
unsigned vp_width, unsigned vp_height);
void (*renderchain_render)(void *data,
void *chain_data,
video_frame_info_t *video_info,
uint64_t frame_count,
const struct video_tex_info *tex_info,
const struct video_tex_info *feedback_info);
void (*resolve_extensions)(
void *data,
void *chain_data,
const char *context_ident,
const video_info_t *video);
const char *ident;
} gl_renderchain_driver_t;
extern struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END]; extern struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END];
bool video_driver_has_windowed(void); bool video_driver_has_windowed(void);