Start going through renderchain driver interface for GL

This commit is contained in:
twinaphex 2017-11-07 11:01:30 +01:00
parent 9c6edaff30
commit a7cd8d94b0
4 changed files with 55 additions and 50 deletions

View File

@ -958,9 +958,7 @@ static void d3d_set_osd_msg(void *data,
font_driver_render_msg(video_info, NULL, msg, params);
}
/* Delay constructor due to lack of exceptions. */
static bool d3d_construct(d3d_video_t *d3d,
static bool d3d_init_internal(d3d_video_t *d3d,
const video_info_t *info, const input_driver_t **input,
void **input_data)
{
@ -1168,7 +1166,7 @@ static void *d3d_init(const video_info_t *info,
video_context_driver_set((const gfx_ctx_driver_t*)ctx_driver);
if (!d3d_construct(d3d, info, input, input_data))
if (!d3d_init_internal(d3d, info, input, input_data))
{
RARCH_ERR("[D3D]: Failed to init D3D.\n");
goto error;

View File

@ -1213,10 +1213,13 @@ static bool gl_frame(void *data, const void *frame,
/* Render to texture in first pass. */
if (gl->fbo_inited)
{
gl2_renderchain_recompute_pass_sizes(
gl, frame_width, frame_height,
gl->vp_out_width, gl->vp_out_height);
gl2_renderchain_start_render(gl, video_info);
if (gl->renderchain_driver->recompute_pass_sizes)
gl->renderchain_driver->recompute_pass_sizes(
gl, frame_width, frame_height,
gl->vp_out_width, gl->vp_out_height);
if (gl->renderchain_driver->start_render)
gl->renderchain_driver->start_render(gl, video_info);
}
#endif
@ -1234,11 +1237,13 @@ static bool gl_frame(void *data, const void *frame,
#ifdef HAVE_FBO
if (gl->fbo_inited)
{
gl2_renderchain_check_fbo_dimensions(gl);
if (gl->renderchain_driver->check_fbo_dimensions)
gl->renderchain_driver->check_fbo_dimensions(gl);
/* Go back to what we're supposed to do,
* render to FBO #0. */
gl2_renderchain_start_render(gl, video_info);
if (gl->renderchain_driver->start_render)
gl->renderchain_driver->start_render(gl, video_info);
}
else
#endif
@ -1348,8 +1353,8 @@ static bool gl_frame(void *data, const void *frame,
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
#ifdef HAVE_FBO
if (gl->fbo_inited)
gl2_renderchain_render(gl, video_info,
if (gl->fbo_inited && gl->renderchain_driver)
gl->renderchain_driver->renderchain_render(gl, video_info,
frame_count, &gl->tex_info, &feedback_info);
#endif
@ -1476,6 +1481,18 @@ static void gl_destroy_resources(gl_t *gl)
gl_query_core_context_unset();
}
static void gl_deinit_chain(gl_t *gl)
{
if (!gl || !gl->renderchain_driver)
return;
if (gl->renderchain_driver->chain_free)
gl->renderchain_driver->chain_free(gl->renderchain_data);
gl->renderchain_driver = NULL;
gl->renderchain_data = NULL;
}
static void gl_free(void *data)
{
gl_t *gl = (gl_t*)data;
@ -1533,7 +1550,9 @@ static void gl_free(void *data)
#endif
#ifdef HAVE_FBO
gl2_renderchain_free(gl);
if (gl->renderchain_driver->free)
gl->renderchain_driver->free(gl);
gl_deinit_chain(gl);
#endif
#ifndef HAVE_OPENGLES
@ -2173,10 +2192,19 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
gl_init_textures_data(gl);
#ifdef HAVE_FBO
gl2_renderchain_init(gl, gl->tex_w, gl->tex_h);
if (!renderchain_gl_init_first(&gl->renderchain_driver,
&gl->renderchain_data))
{
RARCH_ERR("[GL]: Renderchain could not be initialized.\n");
return false;
}
if (gl->renderchain_driver->init)
gl->renderchain_driver->init(gl, gl->tex_w, gl->tex_h);
if (gl->hw_render_use &&
!gl2_renderchain_init_hw_render(gl, gl->tex_w, gl->tex_h))
gl->renderchain_driver->init_hw_render &&
!gl->renderchain_driver->init_hw_render(gl, gl->tex_w, gl->tex_h))
{
RARCH_ERR("[GL]: Hardware rendering context initialization failed.\n");
goto error;
@ -2376,7 +2404,8 @@ static bool gl_set_shader(void *data,
if (textures > gl->textures) /* Have to reinit a bit. */
{
#if defined(HAVE_FBO)
gl2_renderchain_deinit_hw_render(gl);
if (gl->renderchain_driver->deinit_hw_render)
gl->renderchain_driver->deinit_hw_render(gl);
#endif
glDeleteTextures(gl->textures, gl->texture);
@ -2391,13 +2420,14 @@ static bool gl_set_shader(void *data,
gl_init_textures_data(gl);
#if defined(HAVE_FBO)
if (gl->hw_render_use)
gl2_renderchain_init_hw_render(gl, gl->tex_w, gl->tex_h);
if (gl->hw_render_use && gl->renderchain_driver->init_hw_render)
gl->renderchain_driver->init_hw_render(gl, gl->tex_w, gl->tex_h);
#endif
}
#ifdef HAVE_FBO
gl2_renderchain_init(gl, gl->tex_w, gl->tex_h);
if (gl->renderchain_driver)
gl->renderchain_driver->init(gl, gl->tex_w, gl->tex_h);
#endif
/* Apparently need to set viewport for passes when we aren't using FBOs. */

View File

@ -190,7 +190,7 @@ static void gl_check_fbo_dimension(gl_t *gl, unsigned i,
/* On resize, we might have to recreate our FBOs
* due to "Viewport" scale, and set a new viewport. */
void gl2_renderchain_check_fbo_dimensions(void *data)
static void gl2_renderchain_check_fbo_dimensions(void *data)
{
int i;
gl_t *gl = (gl_t*)data;
@ -211,7 +211,7 @@ void gl2_renderchain_check_fbo_dimensions(void *data)
}
}
void gl2_renderchain_render(
static void gl2_renderchain_render(
void *data,
video_frame_info_t *video_info,
uint64_t frame_count,
@ -417,7 +417,7 @@ void gl2_renderchain_deinit_fbo(void *data)
gl->fbo_feedback = 0;
}
void gl2_renderchain_deinit_hw_render(void *data)
static void gl2_renderchain_deinit_hw_render(void *data)
{
gl_t *gl = (gl_t*)data;
if (!gl)
@ -624,7 +624,7 @@ static void gl_create_fbo_textures(gl_t *gl)
* When width/height changes or window sizes change,
* we have to recalculate geometry of our FBO. */
void gl2_renderchain_recompute_pass_sizes(
static void gl2_renderchain_recompute_pass_sizes(
void *data,
unsigned width, unsigned height,
unsigned vp_width, unsigned vp_height)
@ -687,7 +687,8 @@ void gl2_renderchain_recompute_pass_sizes(
}
}
void gl2_renderchain_start_render(void *data, video_frame_info_t *video_info)
static void gl2_renderchain_start_render(void *data,
video_frame_info_t *video_info)
{
/* Used when rendering to an FBO.
* Texture coords have to be aligned
@ -827,7 +828,8 @@ void gl2_renderchain_init(
gl->fbo_inited = true;
}
bool gl2_renderchain_init_hw_render(void *data,
static bool gl2_renderchain_init_hw_render(
void *data,
unsigned width, unsigned height)
{
GLenum status;

View File

@ -48,33 +48,8 @@ void gl_load_texture_data(
unsigned width, unsigned height,
const void *frame, unsigned base_size);
void gl2_renderchain_render(void *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 gl2_renderchain_init(
void *data, unsigned fbo_width, unsigned fbo_height);
void gl2_renderchain_deinit_hw_render(void *data);
void gl2_renderchain_recompute_pass_sizes(void *data,
unsigned width, unsigned height,
unsigned vp_width, unsigned vp_height);
void gl2_renderchain_deinit_fbo(void *data);
void gl2_renderchain_start_render(void *data,
video_frame_info_t *video_info);
void gl2_renderchain_check_fbo_dimensions(void *data);
void gl2_renderchain_free(void *data);
bool gl2_renderchain_init_hw_render(void *data,
unsigned width, unsigned height);
void gl_renderchain_viewport_info(
void *data, struct video_viewport *vp);