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
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;

View File

@ -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,

View File

@ -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();

View File

@ -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);