diff --git a/include/SDL_render.h b/include/SDL_render.h index 1832281ae..e28119a65 100644 --- a/include/SDL_render.h +++ b/include/SDL_render.h @@ -672,6 +672,28 @@ extern DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture * texture); extern DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_Renderer * renderer); +/** + * \brief Bind the texture to the current OpenGL/ES/ES2 context for use with + * OpenGL instructions. + * + * \param texture The SDL texture to bind + * \param texw A pointer to a float that will be filled with the texture width + * \param texh A pointer to a float that will be filled with the texture height + * + * \return 0 on success, or -1 if the operation is not supported + */ +extern DECLSPEC int SDLCALL SDL_GL_BindTexture(SDL_Texture *texture, float *texw, float *texh); + +/** + * \brief Unbind a texture from the current OpenGL/ES/ES2 context. + * + * \param texture The SDL texture to unbind + * + * \return 0 on success, or -1 if the operation is not supported + */ +extern DECLSPEC int SDLCALL SDL_GL_UnbindTexture(SDL_Texture *texture); + + /* Ends C function definitions when using C++ */ #ifdef __cplusplus /* *INDENT-OFF* */ diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 71b999f1a..5320b9f42 100755 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -1382,4 +1382,32 @@ SDL_DestroyRenderer(SDL_Renderer * renderer) renderer->DestroyRenderer(renderer); } +int SDL_GL_BindTexture(SDL_Texture *texture, float *texw, float *texh) +{ + SDL_Renderer *renderer; + + CHECK_TEXTURE_MAGIC(texture, ); + renderer = texture->renderer; + if (renderer && renderer->GL_BindTexture) { + return renderer->GL_BindTexture(renderer, texture, texw, texh); + } + + SDL_Unsupported(); + return -1; +} + +int SDL_GL_UnbindTexture(SDL_Texture *texture) +{ + SDL_Renderer *renderer; + + CHECK_TEXTURE_MAGIC(texture, ); + renderer = texture->renderer; + if (renderer && renderer->GL_UnbindTexture) { + return renderer->GL_UnbindTexture(renderer, texture); + } + + SDL_Unsupported(); + return -1; +} + /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/render/SDL_sysrender.h b/src/render/SDL_sysrender.h index 0a54ff72b..78a026261 100755 --- a/src/render/SDL_sysrender.h +++ b/src/render/SDL_sysrender.h @@ -98,6 +98,9 @@ struct SDL_Renderer void (*DestroyRenderer) (SDL_Renderer * renderer); + int (*GL_BindTexture) (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh); + int (*GL_UnbindTexture) (SDL_Renderer * renderer, SDL_Texture *texture); + /* The current renderer info */ SDL_RendererInfo info; diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c index 34c4b0c2d..6dbc72e86 100755 --- a/src/render/opengl/SDL_render_gl.c +++ b/src/render/opengl/SDL_render_gl.c @@ -73,7 +73,8 @@ static int GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, static void GL_RenderPresent(SDL_Renderer * renderer); static void GL_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void GL_DestroyRenderer(SDL_Renderer * renderer); - +static int GL_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh); +static int GL_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture); SDL_RenderDriver GL_RenderDriver = { GL_CreateRenderer, @@ -322,6 +323,8 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags) renderer->RenderPresent = GL_RenderPresent; renderer->DestroyTexture = GL_DestroyTexture; renderer->DestroyRenderer = GL_DestroyRenderer; + renderer->GL_BindTexture = GL_BindTexture; + renderer->GL_UnbindTexture = GL_UnbindTexture; renderer->info = GL_RenderDriver.info; renderer->info.flags = SDL_RENDERER_ACCELERATED; renderer->driverdata = data; @@ -1228,6 +1231,49 @@ GL_DestroyRenderer(SDL_Renderer * renderer) SDL_free(renderer); } +static int GL_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh) { + GL_RenderData *data = (GL_RenderData *) renderer->driverdata; + GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata; + GL_ActivateRenderer(renderer); + + data->glEnable(texturedata->type); + if (texturedata->yuv) { + data->glActiveTextureARB(GL_TEXTURE2_ARB); + data->glBindTexture(texturedata->type, texturedata->vtexture); + + data->glActiveTextureARB(GL_TEXTURE1_ARB); + data->glBindTexture(texturedata->type, texturedata->utexture); + + data->glActiveTextureARB(GL_TEXTURE0_ARB); + } + data->glBindTexture(texturedata->type, texturedata->texture); + + if(texw) *texw = (float)texturedata->texw; + if(texh) *texh = (float)texturedata->texh; + + return 0; +} + +static int GL_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture) { + GL_RenderData *data = (GL_RenderData *) renderer->driverdata; + GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata; + GL_ActivateRenderer(renderer); + + if (texturedata->yuv) { + data->glActiveTextureARB(GL_TEXTURE2_ARB); + data->glDisable(texturedata->type); + + data->glActiveTextureARB(GL_TEXTURE1_ARB); + data->glDisable(texturedata->type); + + data->glActiveTextureARB(GL_TEXTURE0_ARB); + } + + data->glDisable(texturedata->type); + + return 0; +} + #endif /* SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/render/opengles/SDL_render_gles.c b/src/render/opengles/SDL_render_gles.c index 70d93e414..ccd221601 100755 --- a/src/render/opengles/SDL_render_gles.c +++ b/src/render/opengles/SDL_render_gles.c @@ -78,6 +78,8 @@ static void GLES_RenderPresent(SDL_Renderer * renderer); static void GLES_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void GLES_DestroyRenderer(SDL_Renderer * renderer); +static int GLES_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh); +static int GLES_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture); typedef struct GLES_FBOList GLES_FBOList; @@ -312,6 +314,8 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags) renderer->RenderPresent = GLES_RenderPresent; renderer->DestroyTexture = GLES_DestroyTexture; renderer->DestroyRenderer = GLES_DestroyRenderer; + renderer->GL_BindTexture = GLES_BindTexture; + renderer->GL_UnbindTexture = GLES_UnbindTexture; renderer->info = GLES_RenderDriver.info; renderer->info.flags = SDL_RENDERER_ACCELERATED; renderer->driverdata = data; @@ -1105,6 +1109,30 @@ GLES_DestroyRenderer(SDL_Renderer * renderer) SDL_free(renderer); } +static int GLES_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh) { + GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata; + GLES_TextureData *texturedata = (GLES_TextureData *) texture->driverdata; + GLES_ActivateRenderer(renderer); + + data->glEnable(GL_TEXTURE_2D); + data->glBindTexture(texturedata->type, texturedata->texture); + + if(texw) *texw = (float)texturedata->texw; + if(texh) *texh = (float)texturedata->texh; + + return 0; +} + +static int GLES_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture) { + GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata; + GLES_TextureData *texturedata = (GLES_TextureData *) texture->driverdata; + GLES_ActivateRenderer(renderer); + data->glDisable(texturedata->type); + + return 0; +} + + #endif /* SDL_VIDEO_RENDER_OGL_ES && !SDL_RENDER_DISABLED */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/render/opengles2/SDL_render_gles2.c b/src/render/opengles2/SDL_render_gles2.c index fbf4eaffc..2bdffa884 100755 --- a/src/render/opengles2/SDL_render_gles2.c +++ b/src/render/opengles2/SDL_render_gles2.c @@ -1564,6 +1564,39 @@ GLES2_RenderPresent(SDL_Renderer *renderer) SDL_GL_SwapWindow(renderer->window); } + +/************************************************************************************************* + * Bind/unbinding of textures + *************************************************************************************************/ +static int GLES2_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh); +static int GLES2_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture); + +static int GLES2_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh) { + GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata; + GLES2_TextureData *texturedata = (GLES2_TextureData *)texture->driverdata; + GLES2_ActivateRenderer(renderer); + + data->glActiveTexture(GL_TEXTURE0); + data->glBindTexture(texturedata->texture_type, texturedata->texture); + + if(texw) *texw = 1.0; + if(texh) *texh = 1.0; + + return 0; +} + +static int GLES2_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture) { + GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata; + GLES2_TextureData *texturedata = (GLES2_TextureData *)texture->driverdata; + GLES2_ActivateRenderer(renderer); + + data->glActiveTexture(GL_TEXTURE0); + data->glDisable(texturedata->texture_type); + + return 0; +} + + /************************************************************************************************* * Renderer instantiation * *************************************************************************************************/ @@ -1712,6 +1745,8 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags) renderer->RenderPresent = &GLES2_RenderPresent; renderer->DestroyTexture = &GLES2_DestroyTexture; renderer->DestroyRenderer = &GLES2_DestroyRenderer; + renderer->GL_BindTexture = &GLES2_BindTexture; + renderer->GL_UnbindTexture = &GLES2_UnbindTexture; GLES2_ResetState(renderer);