mirror of
https://github.com/libretro/RetroArch
synced 2025-03-29 22:20:21 +00:00
Move renderchain driver interface to gl_common.h - and replace
some void pointers in function callbacks with gl_t
This commit is contained in:
parent
3773482883
commit
6996e72b49
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user