mirror of
https://github.com/libretro/RetroArch.git
synced 2025-02-18 08:29:09 +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;
|
||||
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
|
||||
|
||||
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);
|
||||
|
||||
bool gl_init_hw_render(gl_t *gl, unsigned width, unsigned height);
|
||||
|
||||
bool gl_check_capability(enum gl_capability_enum enum_idx);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
@ -819,6 +819,120 @@ void gl_renderchain_init(gl_t *gl, unsigned fbo_width, unsigned fbo_height)
|
||||
|
||||
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
|
||||
|
||||
void gl_renderchain_bind_prev_texture(
|
||||
|
Loading…
x
Reference in New Issue
Block a user