diff -r ff2e36039fd2 include/SDL_render.h --- a/include/SDL_render.h Thu Aug 08 23:35:02 2019 +0300 +++ b/include/SDL_render.h Fri Aug 09 22:42:53 2019 +0200 @@ -127,6 +127,18 @@ struct SDL_Texture; typedef struct SDL_Texture SDL_Texture; +/** + * \brief GL/GLES specific driver infos about an SDL_Texture + */ + typedef struct SDL_GL_TextureInfo + { + Uint32 texture_ids[3]; /**< The GL texture IDs */ + int num_texture_ids; /**< The number of GL texture IDs */ + Uint32 texture_type; /**< (GLEnum) Texture type */ + SDL_bool yuv; /**< Hints that the internal format is yuv */ + SDL_bool nv12; /**< Hints that the internal format is nv12 */ + } SDL_GL_TextureInfo; + /* Function prototypes */ @@ -1066,6 +1078,14 @@ extern DECLSPEC int SDLCALL SDL_GL_UnbindTexture(SDL_Texture *texture); /** + * \brief Get the OpenGL/ES Specific driver infos about an SDL texture + * \param texture The SDL texture + * \param info A pointer to an SDL_GL_TextureInfo to be filled + * \return 0 on success, or -1 if the operation is not supported + */ +extern DECLSPEC int SDLCALL SDL_GL_GetTextureInfo(SDL_Texture *texture, SDL_GL_TextureInfo *info); + +/** * \brief Get the CAMetalLayer associated with the given Metal renderer * * \param renderer The renderer to query diff -r ff2e36039fd2 src/dynapi/SDL_dynapi_overrides.h --- a/src/dynapi/SDL_dynapi_overrides.h Thu Aug 08 23:35:02 2019 +0300 +++ b/src/dynapi/SDL_dynapi_overrides.h Fri Aug 09 22:42:53 2019 +0200 @@ -726,3 +726,4 @@ #define SDL_LoadFile SDL_LoadFile_REAL #define SDL_Metal_CreateView SDL_Metal_CreateView_REAL #define SDL_Metal_DestroyView SDL_Metal_DestroyView_REAL +#define SDL_GL_GetTextureInfo SDL_GL_GetTextureInfo_REAL diff -r ff2e36039fd2 src/dynapi/SDL_dynapi_procs.h --- a/src/dynapi/SDL_dynapi_procs.h Thu Aug 08 23:35:02 2019 +0300 +++ b/src/dynapi/SDL_dynapi_procs.h Fri Aug 09 22:42:53 2019 +0200 @@ -782,3 +782,4 @@ SDL_DYNAPI_PROC(void*,SDL_LoadFile,(const char *a, size_t *b),(a,b),return) SDL_DYNAPI_PROC(SDL_MetalView,SDL_Metal_CreateView,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(void,SDL_Metal_DestroyView,(SDL_MetalView a),(a),) +SDL_DYNAPI_PROC(int,SDL_GL_GetTextureInfo,(SDL_Texture *a, SDL_GL_TextureInfo *b),(a,b),return) diff -r ff2e36039fd2 src/render/SDL_render.c --- a/src/render/SDL_render.c Thu Aug 08 23:35:02 2019 +0300 +++ b/src/render/SDL_render.c Fri Aug 09 22:42:53 2019 +0200 @@ -3267,6 +3267,22 @@ return SDL_Unsupported(); } +int SDL_GL_GetTextureInfo(SDL_Texture *texture, SDL_GL_TextureInfo *info) +{ + SDL_Renderer *renderer; + + CHECK_TEXTURE_MAGIC(texture, -1); + renderer = texture->renderer; + if (texture->native) { + return SDL_GL_GetTextureInfo(texture, info); + } else if (renderer && renderer->GL_GetTextureInfo) { + FlushRenderCommandsIfTextureNeeded(texture); /* in case the app messed with it. */ + return renderer->GL_GetTextureInfo(renderer, texture, info); + } + + return SDL_Unsupported(); +} + void * SDL_RenderGetMetalLayer(SDL_Renderer * renderer) { diff -r ff2e36039fd2 src/render/SDL_sysrender.h --- a/src/render/SDL_sysrender.h Thu Aug 08 23:35:02 2019 +0300 +++ b/src/render/SDL_sysrender.h Fri Aug 09 22:42:53 2019 +0200 @@ -162,6 +162,7 @@ int (*GL_BindTexture) (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh); int (*GL_UnbindTexture) (SDL_Renderer * renderer, SDL_Texture *texture); + int (*GL_GetTextureInfo) (SDL_Renderer * renderer, SDL_Texture* texture, SDL_GL_TextureInfo *info); void *(*GetMetalLayer) (SDL_Renderer * renderer); void *(*GetMetalCommandEncoder) (SDL_Renderer * renderer); diff -r ff2e36039fd2 src/render/opengl/SDL_render_gl.c --- a/src/render/opengl/SDL_render_gl.c Thu Aug 08 23:35:02 2019 +0300 +++ b/src/render/opengl/SDL_render_gl.c Fri Aug 09 22:42:53 2019 +0200 @@ -1527,6 +1527,29 @@ return 0; } +static int GL_GetTextureInfo (SDL_Renderer *renderer, SDL_Texture *texture, SDL_GL_TextureInfo *info) +{ + GL_RenderData *data = (GL_RenderData*)renderer->driverdata; + GL_TextureData *tdata = (GL_TextureData *)texture->driverdata; + + SDL_memset(info, 0, sizeof(SDL_GL_TextureInfo)); + + info->texture_type = data->textype; + info->num_texture_ids = 1; + info->texture_ids[0] = tdata->texture; + if (tdata->yuv) { + info->yuv = SDL_TRUE; + info->num_texture_ids = 3; + info->texture_ids[1] = tdata->utexture; + info->texture_ids[2] = tdata->vtexture; + } else if (tdata->nv12) { + info->nv12 = SDL_TRUE; + info->num_texture_ids = 2; + info->texture_ids[1] = tdata->utexture; + } + + return 0; +} SDL_Renderer * GL_CreateRenderer(SDL_Window * window, Uint32 flags) @@ -1591,6 +1614,7 @@ renderer->DestroyRenderer = GL_DestroyRenderer; renderer->GL_BindTexture = GL_BindTexture; renderer->GL_UnbindTexture = GL_UnbindTexture; + renderer->GL_GetTextureInfo = GL_GetTextureInfo; renderer->info = GL_RenderDriver.info; renderer->info.flags = SDL_RENDERER_ACCELERATED; renderer->driverdata = data; diff -r ff2e36039fd2 src/render/opengles/SDL_render_gles.c --- a/src/render/opengles/SDL_render_gles.c Thu Aug 08 23:35:02 2019 +0300 +++ b/src/render/opengles/SDL_render_gles.c Fri Aug 09 22:42:53 2019 +0200 @@ -1093,6 +1093,18 @@ return 0; } +static int GLES_GetTextureInfo (SDL_Renderer *renderer, SDL_Texture *texture, SDL_GL_TextureInfo *info) +{ + GLES_TextureData *tdata = (GLES_TextureData *) texture->driverdata; + SDL_memset(info, 0, sizeof(SDL_GL_TextureInfo)); + + info->num_texture_ids = 1; + info->texture_ids[0] = tdata->texture; + info->texture_type = tdata->type; + + return 0; +} + static SDL_Renderer * GLES_CreateRenderer(SDL_Window * window, Uint32 flags) { @@ -1156,6 +1168,7 @@ renderer->DestroyRenderer = GLES_DestroyRenderer; renderer->GL_BindTexture = GLES_BindTexture; renderer->GL_UnbindTexture = GLES_UnbindTexture; + renderer->GL_GetTextureInfo = GLES_GetTextureInfo; renderer->info = GLES_RenderDriver.info; renderer->info.flags = SDL_RENDERER_ACCELERATED; renderer->driverdata = data; diff -r ff2e36039fd2 src/render/opengles2/SDL_render_gles2.c --- a/src/render/opengles2/SDL_render_gles2.c Thu Aug 08 23:35:02 2019 +0300 +++ b/src/render/opengles2/SDL_render_gles2.c Fri Aug 09 22:42:53 2019 +0200 @@ -1901,6 +1901,27 @@ return 0; } +static int GLES2_GetTextureInfo (SDL_Renderer *renderer, SDL_Texture *texture, SDL_GL_TextureInfo *info) +{ + GLES2_TextureData *tdata = (GLES2_TextureData *)texture->driverdata; + + SDL_memset(info, 0, sizeof(SDL_GL_TextureInfo)); + info->texture_type = tdata->texture_type; + info->num_texture_ids = 1; + info->texture_ids[0] = tdata->texture; + if (tdata->yuv) { + info->yuv = SDL_TRUE; + info->num_texture_ids = 3; + info->texture_ids[1] = tdata->texture_u; + info->texture_ids[2] = tdata->texture_v; + } else if (tdata->nv12) { + info->nv12 = SDL_TRUE; + info->num_texture_ids = 2; + info->texture_ids[1] = tdata->texture_u; + } + + return 0; +} /************************************************************************************************* * Renderer instantiation * @@ -2079,6 +2100,7 @@ renderer->DestroyRenderer = GLES2_DestroyRenderer; renderer->GL_BindTexture = GLES2_BindTexture; renderer->GL_UnbindTexture = GLES2_UnbindTexture; + renderer->GL_GetTextureInfo = GLES2_GetTextureInfo; renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12; renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_IYUV;