Implements SDL_GL_BindTexture and SDL_GL_UnbindTexture (#1576)
This commit is contained in:
parent
bd6eef53b6
commit
bd7b381374
6 changed files with 163 additions and 1 deletions
|
@ -672,6 +672,28 @@ extern DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture * texture);
|
||||||
extern DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_Renderer * renderer);
|
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++ */
|
/* Ends C function definitions when using C++ */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
|
|
|
@ -1382,4 +1382,32 @@ SDL_DestroyRenderer(SDL_Renderer * renderer)
|
||||||
renderer->DestroyRenderer(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: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
|
@ -98,6 +98,9 @@ struct SDL_Renderer
|
||||||
|
|
||||||
void (*DestroyRenderer) (SDL_Renderer * 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 */
|
/* The current renderer info */
|
||||||
SDL_RendererInfo info;
|
SDL_RendererInfo info;
|
||||||
|
|
||||||
|
|
|
@ -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_RenderPresent(SDL_Renderer * renderer);
|
||||||
static void GL_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
static void GL_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||||
static void GL_DestroyRenderer(SDL_Renderer * renderer);
|
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 = {
|
SDL_RenderDriver GL_RenderDriver = {
|
||||||
GL_CreateRenderer,
|
GL_CreateRenderer,
|
||||||
|
@ -322,6 +323,8 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
renderer->RenderPresent = GL_RenderPresent;
|
renderer->RenderPresent = GL_RenderPresent;
|
||||||
renderer->DestroyTexture = GL_DestroyTexture;
|
renderer->DestroyTexture = GL_DestroyTexture;
|
||||||
renderer->DestroyRenderer = GL_DestroyRenderer;
|
renderer->DestroyRenderer = GL_DestroyRenderer;
|
||||||
|
renderer->GL_BindTexture = GL_BindTexture;
|
||||||
|
renderer->GL_UnbindTexture = GL_UnbindTexture;
|
||||||
renderer->info = GL_RenderDriver.info;
|
renderer->info = GL_RenderDriver.info;
|
||||||
renderer->info.flags = SDL_RENDERER_ACCELERATED;
|
renderer->info.flags = SDL_RENDERER_ACCELERATED;
|
||||||
renderer->driverdata = data;
|
renderer->driverdata = data;
|
||||||
|
@ -1228,6 +1231,49 @@ GL_DestroyRenderer(SDL_Renderer * renderer)
|
||||||
SDL_free(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 */
|
#endif /* SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED */
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
|
@ -78,6 +78,8 @@ static void GLES_RenderPresent(SDL_Renderer * renderer);
|
||||||
static void GLES_DestroyTexture(SDL_Renderer * renderer,
|
static void GLES_DestroyTexture(SDL_Renderer * renderer,
|
||||||
SDL_Texture * texture);
|
SDL_Texture * texture);
|
||||||
static void GLES_DestroyRenderer(SDL_Renderer * renderer);
|
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;
|
typedef struct GLES_FBOList GLES_FBOList;
|
||||||
|
|
||||||
|
@ -312,6 +314,8 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
renderer->RenderPresent = GLES_RenderPresent;
|
renderer->RenderPresent = GLES_RenderPresent;
|
||||||
renderer->DestroyTexture = GLES_DestroyTexture;
|
renderer->DestroyTexture = GLES_DestroyTexture;
|
||||||
renderer->DestroyRenderer = GLES_DestroyRenderer;
|
renderer->DestroyRenderer = GLES_DestroyRenderer;
|
||||||
|
renderer->GL_BindTexture = GLES_BindTexture;
|
||||||
|
renderer->GL_UnbindTexture = GLES_UnbindTexture;
|
||||||
renderer->info = GLES_RenderDriver.info;
|
renderer->info = GLES_RenderDriver.info;
|
||||||
renderer->info.flags = SDL_RENDERER_ACCELERATED;
|
renderer->info.flags = SDL_RENDERER_ACCELERATED;
|
||||||
renderer->driverdata = data;
|
renderer->driverdata = data;
|
||||||
|
@ -1105,6 +1109,30 @@ GLES_DestroyRenderer(SDL_Renderer * renderer)
|
||||||
SDL_free(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 */
|
#endif /* SDL_VIDEO_RENDER_OGL_ES && !SDL_RENDER_DISABLED */
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
|
@ -1564,6 +1564,39 @@ GLES2_RenderPresent(SDL_Renderer *renderer)
|
||||||
SDL_GL_SwapWindow(renderer->window);
|
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 *
|
* Renderer instantiation *
|
||||||
*************************************************************************************************/
|
*************************************************************************************************/
|
||||||
|
@ -1712,6 +1745,8 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags)
|
||||||
renderer->RenderPresent = &GLES2_RenderPresent;
|
renderer->RenderPresent = &GLES2_RenderPresent;
|
||||||
renderer->DestroyTexture = &GLES2_DestroyTexture;
|
renderer->DestroyTexture = &GLES2_DestroyTexture;
|
||||||
renderer->DestroyRenderer = &GLES2_DestroyRenderer;
|
renderer->DestroyRenderer = &GLES2_DestroyRenderer;
|
||||||
|
renderer->GL_BindTexture = &GLES2_BindTexture;
|
||||||
|
renderer->GL_UnbindTexture = &GLES2_UnbindTexture;
|
||||||
|
|
||||||
GLES2_ResetState(renderer);
|
GLES2_ResetState(renderer);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue