From 9b06ec6c4ef1a72232d7255bb8b9c22874500e5e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 2 Aug 2016 03:10:55 +0200 Subject: [PATCH] (GL) Move more FBO functions to render_chain_gl_legacy --- gfx/drivers/gl.c | 114 ------------------ .../gl_renderchains/render_chain_driver.h | 2 + .../gl_renderchains/render_chain_gl_legacy.c | 114 ++++++++++++++++++ 3 files changed, 116 insertions(+), 114 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index b29051a8c8..7849cf3b30 100644 --- a/gfx/drivers/gl.c +++ b/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) diff --git a/gfx/drivers/gl_renderchains/render_chain_driver.h b/gfx/drivers/gl_renderchains/render_chain_driver.h index 1940c92b9d..996983e12f 100644 --- a/gfx/drivers/gl_renderchains/render_chain_driver.h +++ b/gfx/drivers/gl_renderchains/render_chain_driver.h @@ -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 diff --git a/gfx/drivers/gl_renderchains/render_chain_gl_legacy.c b/gfx/drivers/gl_renderchains/render_chain_gl_legacy.c index 4e2f85e699..0de8c71454 100644 --- a/gfx/drivers/gl_renderchains/render_chain_gl_legacy.c +++ b/gfx/drivers/gl_renderchains/render_chain_gl_legacy.c @@ -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(