diff --git a/libretro-common/glsm/glsm.c b/libretro-common/glsm/glsm.c index db60260326..f01d0fc3a5 100644 --- a/libretro-common/glsm/glsm.c +++ b/libretro-common/glsm/glsm.c @@ -21,6 +21,7 @@ */ #include +#include #include #include @@ -28,7 +29,7 @@ struct gl_cached_state { struct { - GLuint ids[MAX_TEXTURE]; + GLuint *ids; } bind_textures; #ifndef HAVE_OPENGLES @@ -176,6 +177,7 @@ struct gl_cached_state int cap_translate[SGL_CAP_MAX]; }; +static GLint glsm_max_textures; static struct retro_hw_render_callback hw_render; static struct gl_cached_state gl_state; @@ -1853,6 +1855,10 @@ static void glsm_state_setup(void) for (i = 0; i < MAX_ATTRIB; i++) gl_state.vertex_attrib_pointer.enabled[i] = 0; + glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &glsm_max_textures); + + gl_state.bind_textures.ids = (GLuint*)calloc(glsm_max_textures, sizeof(GLuint)); + gl_state.framebuf = hw_render.get_current_framebuffer(); gl_state.cullface.mode = GL_BACK; gl_state.frontface.mode = GL_CCW; @@ -1978,7 +1984,7 @@ static void glsm_state_bind(void) gl_state.stencilfunc.ref, gl_state.stencilfunc.mask); - for (i = 0; i < MAX_TEXTURE; i ++) + for (i = 0; i < glsm_max_textures; i ++) { glActiveTexture(GL_TEXTURE0 + i); glBindTexture(GL_TEXTURE_2D, gl_state.bind_textures.ids[i]); @@ -2035,7 +2041,7 @@ static void glsm_state_unbind(void) glStencilFunc(GL_ALWAYS,0,1); /* Clear textures */ - for (i = 0; i < MAX_TEXTURE; i ++) + for (i = 0; i < glsm_max_textures; i ++) { glActiveTexture(GL_TEXTURE0 + i); glBindTexture(GL_TEXTURE_2D, 0); @@ -2048,6 +2054,13 @@ static void glsm_state_unbind(void) glBindFramebuffer(RARCH_GL_FRAMEBUFFER, 0); } +static bool glsm_state_ctx_destroy(void *data) +{ + if (gl_state.bind_textures.ids) + free(gl_state.bind_textures.ids); + gl_state.bind_textures.ids = NULL; +} + static bool glsm_state_ctx_init(void *data) { glsm_ctx_params_t *params = (glsm_ctx_params_t*)data; @@ -2117,6 +2130,9 @@ bool glsm_ctl(enum glsm_state_ctl state, void *data) case GLSM_CTL_STATE_CONTEXT_RESET: rglgen_resolve_symbols(hw_render.get_proc_address); break; + case GLSM_CTL_STATE_CONTEXT_DESTROY: + glsm_state_ctx_destroy(data); + break; case GLSM_CTL_STATE_CONTEXT_INIT: return glsm_state_ctx_init(data); case GLSM_CTL_STATE_SETUP: diff --git a/libretro-common/include/glsm/glsm.h b/libretro-common/include/glsm/glsm.h index ef705d4c41..f35b2e382e 100644 --- a/libretro-common/include/glsm/glsm.h +++ b/libretro-common/include/glsm/glsm.h @@ -85,7 +85,6 @@ typedef GLclampf GLclampd; #endif #define MAX_ATTRIB 8 -#define MAX_TEXTURE 32 enum { @@ -117,6 +116,7 @@ enum glsm_state_ctl GLSM_CTL_STATE_BIND, GLSM_CTL_STATE_UNBIND, GLSM_CTL_STATE_CONTEXT_RESET, + GLSM_CTL_STATE_CONTEXT_DESTROY, GLSM_CTL_STATE_CONTEXT_INIT, GLSM_CTL_IS_IMM_VBO, GLSM_CTL_SET_IMM_VBO,