mirror of
https://github.com/libretro/RetroArch
synced 2025-03-02 19:13:34 +00:00
(GL) Move more FBO functions to render_chain_gl_legacy
This commit is contained in:
parent
bd3cd08be8
commit
9b06ec6c4e
114
gfx/drivers/gl.c
114
gfx/drivers/gl.c
@ -761,120 +761,6 @@ static uintptr_t gl_get_current_framebuffer(void *data)
|
|||||||
gl_t *gl = (gl_t*)data;
|
gl_t *gl = (gl_t*)data;
|
||||||
return gl->hw_render_fbo[(gl->tex_index + 1) % gl->textures];
|
return gl->hw_render_fbo[(gl->tex_index + 1) % gl->textures];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void gl_deinit_hw_render(gl_t *gl)
|
|
||||||
{
|
|
||||||
if (!gl)
|
|
||||||
return;
|
|
||||||
|
|
||||||
context_bind_hw_render(true);
|
|
||||||
|
|
||||||
if (gl->hw_render_fbo_init)
|
|
||||||
glDeleteFramebuffers(gl->textures, gl->hw_render_fbo);
|
|
||||||
if (gl->hw_render_depth_init)
|
|
||||||
glDeleteRenderbuffers(gl->textures, gl->hw_render_depth);
|
|
||||||
gl->hw_render_fbo_init = false;
|
|
||||||
|
|
||||||
context_bind_hw_render(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool gl_init_hw_render(gl_t *gl, unsigned width, unsigned height)
|
|
||||||
{
|
|
||||||
GLenum status;
|
|
||||||
unsigned i;
|
|
||||||
bool depth = false;
|
|
||||||
bool stencil = false;
|
|
||||||
GLint max_fbo_size = 0;
|
|
||||||
GLint max_renderbuffer_size = 0;
|
|
||||||
struct retro_hw_render_callback *hwr =
|
|
||||||
video_driver_get_hw_context();
|
|
||||||
|
|
||||||
/* We can only share texture objects through contexts.
|
|
||||||
* FBOs are "abstract" objects and are not shared. */
|
|
||||||
context_bind_hw_render(true);
|
|
||||||
|
|
||||||
RARCH_LOG("[GL]: Initializing HW render (%u x %u).\n", width, height);
|
|
||||||
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_fbo_size);
|
|
||||||
glGetIntegerv(RARCH_GL_MAX_RENDERBUFFER_SIZE, &max_renderbuffer_size);
|
|
||||||
RARCH_LOG("[GL]: Max texture size: %d px, renderbuffer size: %d px.\n",
|
|
||||||
max_fbo_size, max_renderbuffer_size);
|
|
||||||
|
|
||||||
if (!gl_check_capability(GL_CAPS_FBO))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
|
||||||
glGenFramebuffers(gl->textures, gl->hw_render_fbo);
|
|
||||||
|
|
||||||
depth = hwr->depth;
|
|
||||||
stencil = hwr->stencil;
|
|
||||||
|
|
||||||
#ifdef HAVE_OPENGLES2
|
|
||||||
if (!gl_check_capability(GL_CAPS_PACKED_DEPTH_STENCIL))
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (depth)
|
|
||||||
{
|
|
||||||
glGenRenderbuffers(gl->textures, gl->hw_render_depth);
|
|
||||||
gl->hw_render_depth_init = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < gl->textures; i++)
|
|
||||||
{
|
|
||||||
glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->hw_render_fbo[i]);
|
|
||||||
glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER,
|
|
||||||
RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->texture[i], 0);
|
|
||||||
|
|
||||||
if (depth)
|
|
||||||
{
|
|
||||||
glBindRenderbuffer(RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]);
|
|
||||||
glRenderbufferStorage(RARCH_GL_RENDERBUFFER,
|
|
||||||
stencil ? RARCH_GL_DEPTH24_STENCIL8 : GL_DEPTH_COMPONENT16,
|
|
||||||
width, height);
|
|
||||||
glBindRenderbuffer(RARCH_GL_RENDERBUFFER, 0);
|
|
||||||
|
|
||||||
if (stencil)
|
|
||||||
{
|
|
||||||
#if defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES1) || defined(OSX_PPC)
|
|
||||||
/* GLES2 is a bit weird, as always.
|
|
||||||
* There's no GL_DEPTH_STENCIL_ATTACHMENT like in desktop GL. */
|
|
||||||
glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER,
|
|
||||||
RARCH_GL_DEPTH_ATTACHMENT,
|
|
||||||
RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]);
|
|
||||||
glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER,
|
|
||||||
RARCH_GL_STENCIL_ATTACHMENT,
|
|
||||||
RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]);
|
|
||||||
#else
|
|
||||||
/* We use ARB FBO extensions, no need to check. */
|
|
||||||
glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER,
|
|
||||||
GL_DEPTH_STENCIL_ATTACHMENT,
|
|
||||||
RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER,
|
|
||||||
RARCH_GL_DEPTH_ATTACHMENT,
|
|
||||||
RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
status = glCheckFramebufferStatus(RARCH_GL_FRAMEBUFFER);
|
|
||||||
if (status != RARCH_GL_FRAMEBUFFER_COMPLETE)
|
|
||||||
{
|
|
||||||
RARCH_ERR("[GL]: Failed to create HW render FBO #%u, error: 0x%u.\n",
|
|
||||||
i, (unsigned)status);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gl_bind_backbuffer();
|
|
||||||
gl->hw_render_fbo_init = true;
|
|
||||||
|
|
||||||
context_bind_hw_render(false);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void gl_set_rotation(void *data, unsigned rotation)
|
static void gl_set_rotation(void *data, unsigned rotation)
|
||||||
|
@ -94,6 +94,8 @@ void gl_check_fbo_dimensions(gl_t *gl);
|
|||||||
|
|
||||||
void gl_renderchain_free(gl_t *gl);
|
void gl_renderchain_free(gl_t *gl);
|
||||||
|
|
||||||
|
bool gl_init_hw_render(gl_t *gl, unsigned width, unsigned height);
|
||||||
|
|
||||||
bool gl_check_capability(enum gl_capability_enum enum_idx);
|
bool gl_check_capability(enum gl_capability_enum enum_idx);
|
||||||
|
|
||||||
RETRO_END_DECLS
|
RETRO_END_DECLS
|
||||||
|
@ -819,6 +819,120 @@ void gl_renderchain_init(gl_t *gl, unsigned fbo_width, unsigned fbo_height)
|
|||||||
|
|
||||||
gl->fbo_inited = true;
|
gl->fbo_inited = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gl_deinit_hw_render(gl_t *gl)
|
||||||
|
{
|
||||||
|
if (!gl)
|
||||||
|
return;
|
||||||
|
|
||||||
|
context_bind_hw_render(true);
|
||||||
|
|
||||||
|
if (gl->hw_render_fbo_init)
|
||||||
|
glDeleteFramebuffers(gl->textures, gl->hw_render_fbo);
|
||||||
|
if (gl->hw_render_depth_init)
|
||||||
|
glDeleteRenderbuffers(gl->textures, gl->hw_render_depth);
|
||||||
|
gl->hw_render_fbo_init = false;
|
||||||
|
|
||||||
|
context_bind_hw_render(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool gl_init_hw_render(gl_t *gl, unsigned width, unsigned height)
|
||||||
|
{
|
||||||
|
GLenum status;
|
||||||
|
unsigned i;
|
||||||
|
bool depth = false;
|
||||||
|
bool stencil = false;
|
||||||
|
GLint max_fbo_size = 0;
|
||||||
|
GLint max_renderbuffer_size = 0;
|
||||||
|
struct retro_hw_render_callback *hwr =
|
||||||
|
video_driver_get_hw_context();
|
||||||
|
|
||||||
|
/* We can only share texture objects through contexts.
|
||||||
|
* FBOs are "abstract" objects and are not shared. */
|
||||||
|
context_bind_hw_render(true);
|
||||||
|
|
||||||
|
RARCH_LOG("[GL]: Initializing HW render (%u x %u).\n", width, height);
|
||||||
|
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_fbo_size);
|
||||||
|
glGetIntegerv(RARCH_GL_MAX_RENDERBUFFER_SIZE, &max_renderbuffer_size);
|
||||||
|
RARCH_LOG("[GL]: Max texture size: %d px, renderbuffer size: %d px.\n",
|
||||||
|
max_fbo_size, max_renderbuffer_size);
|
||||||
|
|
||||||
|
if (!gl_check_capability(GL_CAPS_FBO))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
glGenFramebuffers(gl->textures, gl->hw_render_fbo);
|
||||||
|
|
||||||
|
depth = hwr->depth;
|
||||||
|
stencil = hwr->stencil;
|
||||||
|
|
||||||
|
#ifdef HAVE_OPENGLES2
|
||||||
|
if (!gl_check_capability(GL_CAPS_PACKED_DEPTH_STENCIL))
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (depth)
|
||||||
|
{
|
||||||
|
glGenRenderbuffers(gl->textures, gl->hw_render_depth);
|
||||||
|
gl->hw_render_depth_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < gl->textures; i++)
|
||||||
|
{
|
||||||
|
glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->hw_render_fbo[i]);
|
||||||
|
glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER,
|
||||||
|
RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->texture[i], 0);
|
||||||
|
|
||||||
|
if (depth)
|
||||||
|
{
|
||||||
|
glBindRenderbuffer(RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]);
|
||||||
|
glRenderbufferStorage(RARCH_GL_RENDERBUFFER,
|
||||||
|
stencil ? RARCH_GL_DEPTH24_STENCIL8 : GL_DEPTH_COMPONENT16,
|
||||||
|
width, height);
|
||||||
|
glBindRenderbuffer(RARCH_GL_RENDERBUFFER, 0);
|
||||||
|
|
||||||
|
if (stencil)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES1) || defined(OSX_PPC)
|
||||||
|
/* GLES2 is a bit weird, as always.
|
||||||
|
* There's no GL_DEPTH_STENCIL_ATTACHMENT like in desktop GL. */
|
||||||
|
glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER,
|
||||||
|
RARCH_GL_DEPTH_ATTACHMENT,
|
||||||
|
RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]);
|
||||||
|
glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER,
|
||||||
|
RARCH_GL_STENCIL_ATTACHMENT,
|
||||||
|
RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]);
|
||||||
|
#else
|
||||||
|
/* We use ARB FBO extensions, no need to check. */
|
||||||
|
glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER,
|
||||||
|
GL_DEPTH_STENCIL_ATTACHMENT,
|
||||||
|
RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER,
|
||||||
|
RARCH_GL_DEPTH_ATTACHMENT,
|
||||||
|
RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status = glCheckFramebufferStatus(RARCH_GL_FRAMEBUFFER);
|
||||||
|
if (status != RARCH_GL_FRAMEBUFFER_COMPLETE)
|
||||||
|
{
|
||||||
|
RARCH_ERR("[GL]: Failed to create HW render FBO #%u, error: 0x%u.\n",
|
||||||
|
i, (unsigned)status);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gl_bind_backbuffer();
|
||||||
|
gl->hw_render_fbo_init = true;
|
||||||
|
|
||||||
|
context_bind_hw_render(false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void gl_renderchain_bind_prev_texture(
|
void gl_renderchain_bind_prev_texture(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user