From 6996e72b49c2e55a1f17316f4fd98a0c9a781d95 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 13 May 2018 05:53:06 +0200 Subject: [PATCH] Move renderchain driver interface to gl_common.h - and replace some void pointers in function callbacks with gl_t --- gfx/common/gl_common.h | 79 +++++++++++++++++++++++ gfx/drivers_renderchain/gl1_renderchain.c | 27 +++----- gfx/drivers_renderchain/gl2_renderchain.c | 57 ++++++---------- gfx/video_driver.h | 77 ---------------------- 4 files changed, 108 insertions(+), 132 deletions(-) diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 83edc31f94..833fd1d3f0 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -154,6 +154,85 @@ RETRO_BEGIN_DECLS #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 { GLenum internal_fmt; diff --git a/gfx/drivers_renderchain/gl1_renderchain.c b/gfx/drivers_renderchain/gl1_renderchain.c index 1d999820c8..fe7515f724 100644 --- a/gfx/drivers_renderchain/gl1_renderchain.c +++ b/gfx/drivers_renderchain/gl1_renderchain.c @@ -56,12 +56,11 @@ typedef struct gl1_renderchain } gl1_renderchain_t; static void gl1_renderchain_viewport_info( - void *data, void *chain_data, + gl_t *gl, void *chain_data, struct video_viewport *vp) { unsigned width, height; unsigned top_y, top_dist; - gl_t *gl = (gl_t*)data; video_driver_get_size(&width, &height); @@ -76,16 +75,10 @@ static void gl1_renderchain_viewport_info( } static bool gl1_renderchain_read_viewport( - void *data, void *chain_data, + gl_t *gl, void *chain_data, uint8_t *buffer, bool is_idle) { - unsigned num_pixels = 0; - gl_t *gl = (gl_t*)data; - - if (!gl) - return false; - - num_pixels = gl->vp.width * gl->vp.height; + unsigned num_pixels = gl->vp.width * gl->vp.height; /* Use slow synchronous readbacks. Use this with plain screenshots 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); } -static void gl1_renderchain_restore_default_state(void *data, +static void gl1_renderchain_restore_default_state(gl_t *gl, void *chain_data) { - gl_t *gl = (gl_t*)data; if (!gl) return; + glEnable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); @@ -192,13 +185,12 @@ static void gl1_renderchain_restore_default_state(void *data, } static void gl1_renderchain_copy_frame( - void *data, + gl_t *gl, void *chain_data, video_frame_info_t *video_info, const void *frame, unsigned width, unsigned height, unsigned pitch) { - gl_t *gl = (gl_t*)data; const GLvoid *data_buf = frame; 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); } -static void gl1_renderchain_readback(void *data, +static void gl1_renderchain_readback( + gl_t *gl, void *chain_data, unsigned alignment, unsigned fmt, unsigned type, void *src) { - gl_t *gl = (gl_t*)data; - glPixelStorei(GL_PACK_ALIGNMENT, alignment); glPixelStorei(GL_PACK_ROW_LENGTH, 0); glReadBuffer(GL_BACK); @@ -278,7 +269,7 @@ static void gl1_renderchain_set_coords(void *handle_data, } static void gl1_renderchain_render( - void *data, + gl_t *gl, void *chain_data, video_frame_info_t *video_info, uint64_t frame_count, diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 0a72e89137..13cf4b2799 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -296,11 +296,10 @@ static void gl_check_fbo_dimension(gl_t *gl, /* On resize, we might have to recreate our FBOs * due to "Viewport" scale, and set a new viewport. */ -static void gl2_renderchain_check_fbo_dimensions(void *data, - void *chain_data) +static void gl2_renderchain_check_fbo_dimensions( + gl_t *gl, void *chain_data) { int i; - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; /* 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( - void *data, + gl_t *gl, void *chain_data, video_frame_info_t *video_info, uint64_t frame_count, @@ -331,7 +330,6 @@ static void gl2_renderchain_render( video_shader_ctx_coords_t coords; video_shader_ctx_params_t params; video_shader_ctx_info_t shader_info; - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; static GLfloat fbo_tex_coords[8] = {0.0f}; 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; } -static void gl2_renderchain_deinit_fbo(void *data, +static void gl2_renderchain_deinit_fbo(gl_t *gl, void *chain_data) { - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; if (gl) @@ -531,10 +528,9 @@ static void gl2_renderchain_deinit_fbo(void *data, } static void gl2_renderchain_deinit_hw_render( - void *data, + gl_t *gl, void *chain_data) { - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; if (!gl) return; @@ -550,10 +546,8 @@ static void gl2_renderchain_deinit_hw_render( 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_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. */ static void gl2_renderchain_recompute_pass_sizes( - void *data, + gl_t *gl, void *chain_data, unsigned width, unsigned height, unsigned vp_width, unsigned vp_height) { int i; - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; bool size_modified = false; 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, video_frame_info_t *video_info) { @@ -817,7 +811,6 @@ static void gl2_renderchain_start_render(void *data, 0, 1, 1, 1 }; - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; 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. */ void gl2_renderchain_init( - void *data, void *chain_data, + gl_t *gl, void *chain_data, unsigned fbo_width, unsigned fbo_height) { int i; @@ -849,7 +842,6 @@ void gl2_renderchain_init( video_shader_ctx_scale_t scaler; video_shader_ctx_info_t shader_info; struct gfx_fbo_scale scale, scale_last; - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; if (!video_shader_driver_info(&shader_info)) @@ -951,7 +943,7 @@ void gl2_renderchain_init( } static bool gl2_renderchain_init_hw_render( - void *data, + gl_t *gl, void *chain_data, unsigned width, unsigned height) { @@ -963,7 +955,6 @@ static bool gl2_renderchain_init_hw_render( GLint max_renderbuffer_size = 0; struct retro_hw_render_callback *hwr = video_driver_get_hw_context(); - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; /* 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( - void *data, + gl_t *gl, void *chain_data, const struct video_tex_info *tex_info) { - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; 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( - void *data, void *chain_data, + gl_t *gl, void *chain_data, struct video_viewport *vp) { unsigned width, height; unsigned top_y, top_dist; - gl_t *gl = (gl_t*)data; video_driver_get_size(&width, &height); @@ -1100,12 +1089,11 @@ static void gl2_renderchain_viewport_info( } static bool gl2_renderchain_read_viewport( - void *data, + gl_t *gl, void *chain_data, uint8_t *buffer, bool is_idle) { unsigned num_pixels = 0; - gl_t *gl = (gl_t*)data; if (!gl) return false; @@ -1258,10 +1246,9 @@ static void gl2_renderchain_free_vao(void *data, #endif static void gl2_renderchain_restore_default_state( - void *data, + gl_t *gl, void *chain_data) { - gl_t *gl = (gl_t*)data; if (!gl) return; #ifndef HAVE_OPENGLES @@ -1274,13 +1261,12 @@ static void gl2_renderchain_restore_default_state( } static void gl2_renderchain_copy_frame( - void *data, + gl_t *gl, void *chain_data, video_frame_info_t *video_info, const void *frame, unsigned width, unsigned height, unsigned pitch) { - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; (void)chain; @@ -1436,14 +1422,13 @@ static void gl2_renderchain_init_pbo(unsigned size, } #endif -static void gl2_renderchain_readback(void *data, +static void gl2_renderchain_readback( + gl_t *gl, void *chain_data, unsigned alignment, unsigned fmt, unsigned type, void *src) { - gl_t *gl = (gl_t*)data; - glPixelStorei(GL_PACK_ALIGNMENT, alignment); #ifndef HAVE_OPENGLES glPixelStorei(GL_PACK_ROW_LENGTH, 0); @@ -1499,11 +1484,10 @@ static void gl2_renderchain_fence_free(void *data, #endif 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 texture_type) { - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; (void)chain; @@ -1528,11 +1512,10 @@ static void gl2_renderchain_init_textures_reference( #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, const video_info_t *video) { - gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; settings_t *settings = config_get_ptr(); diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 5cb44cf763..82b5f4d3cd 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -854,83 +854,6 @@ typedef struct d3d_renderchain_driver const char *ident; } 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]; bool video_driver_has_windowed(void);