@@ -133,6 +133,7 @@ typedef struct GPU_PaletteData
133133
134134typedef struct GPU_TextureData
135135{
136+ bool external_texture ;
136137 SDL_GPUTexture * texture ;
137138 SDL_GPUTextureFormat format ;
138139 void * pixels ;
@@ -142,11 +143,14 @@ typedef struct GPU_TextureData
142143#ifdef SDL_HAVE_YUV
143144 // YV12 texture support
144145 bool yuv ;
146+ bool external_texture_u ;
147+ bool external_texture_v ;
145148 SDL_GPUTexture * textureU ;
146149 SDL_GPUTexture * textureV ;
147150
148151 // NV12 texture support
149152 bool nv12 ;
153+ bool external_texture_nv ;
150154 SDL_GPUTexture * textureNV ;
151155#endif
152156} GPU_TextureData ;
@@ -261,6 +265,12 @@ static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
261265 SDL_GPUTextureFormat format ;
262266 SDL_GPUTextureUsageFlags usage = SDL_GPU_TEXTUREUSAGE_SAMPLER ;
263267
268+ data = (GPU_TextureData * )SDL_calloc (1 , sizeof (* data ));
269+ if (!data ) {
270+ return false;
271+ }
272+ texture -> internal = data ;
273+
264274 switch (texture -> format ) {
265275 case SDL_PIXELFORMAT_INDEX8 :
266276 case SDL_PIXELFORMAT_YV12 :
@@ -292,11 +302,7 @@ static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
292302 return SDL_SetError ("Texture format %s not supported by SDL_GPU" ,
293303 SDL_GetPixelFormatName (texture -> format ));
294304 }
295-
296- data = (GPU_TextureData * )SDL_calloc (1 , sizeof (* data ));
297- if (!data ) {
298- return false;
299- }
305+ data -> format = format ;
300306
301307 if (texture -> access == SDL_TEXTUREACCESS_STREAMING ) {
302308 size_t size ;
@@ -326,7 +332,6 @@ static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
326332 usage |= SDL_GPU_TEXTUREUSAGE_COLOR_TARGET ;
327333 }
328334
329- texture -> internal = data ;
330335 SDL_GPUTextureCreateInfo tci ;
331336 SDL_zero (tci );
332337 tci .format = format ;
@@ -336,11 +341,16 @@ static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
336341 tci .width = texture -> w ;
337342 tci .height = texture -> h ;
338343 tci .sample_count = SDL_GPU_SAMPLECOUNT_1 ;
344+ tci .props = create_props ;
339345
340- data -> format = format ;
341- data -> texture = SDL_CreateGPUTexture (renderdata -> device , & tci );
342- if (!data -> texture ) {
343- return false;
346+ data -> texture = SDL_GetPointerProperty (create_props , SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER , NULL );
347+ if (data -> texture ) {
348+ data -> external_texture = true;
349+ } else {
350+ data -> texture = SDL_CreateGPUTexture (renderdata -> device , & tci );
351+ if (!data -> texture ) {
352+ return false;
353+ }
344354 }
345355
346356 SDL_PropertiesID props = SDL_GetTextureProperties (texture );
@@ -354,15 +364,25 @@ static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
354364 tci .width = (tci .width + 1 ) / 2 ;
355365 tci .height = (tci .height + 1 ) / 2 ;
356366
357- data -> textureU = SDL_CreateGPUTexture (renderdata -> device , & tci );
358- if (!data -> textureU ) {
359- return false;
367+ data -> textureU = SDL_GetPointerProperty (create_props , SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_POINTER , NULL );
368+ if (data -> textureU ) {
369+ data -> external_texture_u = true;
370+ } else {
371+ data -> textureU = SDL_CreateGPUTexture (renderdata -> device , & tci );
372+ if (!data -> textureU ) {
373+ return false;
374+ }
360375 }
361376 SDL_SetPointerProperty (props , SDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER , data -> textureU );
362377
363- data -> textureV = SDL_CreateGPUTexture (renderdata -> device , & tci );
364- if (!data -> textureV ) {
365- return false;
378+ data -> textureV = SDL_GetPointerProperty (create_props , SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_POINTER , NULL );
379+ if (data -> textureV ) {
380+ data -> external_texture_v = true;
381+ } else {
382+ data -> textureV = SDL_CreateGPUTexture (renderdata -> device , & tci );
383+ if (!data -> textureV ) {
384+ return false;
385+ }
366386 }
367387 SDL_SetPointerProperty (props , SDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER , data -> textureU );
368388
@@ -378,17 +398,22 @@ static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
378398
379399 data -> nv12 = true;
380400
381- tci .width = ((tci .width + 1 ) / 2 );
382- tci .height = ((tci .height + 1 ) / 2 );
383- if (texture -> format == SDL_PIXELFORMAT_P010 ) {
384- tci .format = SDL_GPU_TEXTUREFORMAT_R16G16_UNORM ;
401+ data -> textureNV = SDL_GetPointerProperty (create_props , SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_POINTER , NULL );
402+ if (data -> textureNV ) {
403+ data -> external_texture_nv = true;
385404 } else {
386- tci .format = SDL_GPU_TEXTUREFORMAT_R8G8_UNORM ;
387- }
405+ tci .width = ((tci .width + 1 ) / 2 );
406+ tci .height = ((tci .height + 1 ) / 2 );
407+ if (texture -> format == SDL_PIXELFORMAT_P010 ) {
408+ tci .format = SDL_GPU_TEXTUREFORMAT_R16G16_UNORM ;
409+ } else {
410+ tci .format = SDL_GPU_TEXTUREFORMAT_R8G8_UNORM ;
411+ }
388412
389- data -> textureNV = SDL_CreateGPUTexture (renderdata -> device , & tci );
390- if (!data -> textureNV ) {
391- return false;
413+ data -> textureNV = SDL_CreateGPUTexture (renderdata -> device , & tci );
414+ if (!data -> textureNV ) {
415+ return false;
416+ }
392417 }
393418 SDL_SetPointerProperty (props , SDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER , data -> textureNV );
394419
@@ -1484,11 +1509,19 @@ static void GPU_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
14841509 return ;
14851510 }
14861511
1487- SDL_ReleaseGPUTexture (renderdata -> device , data -> texture );
1512+ if (!data -> external_texture ) {
1513+ SDL_ReleaseGPUTexture (renderdata -> device , data -> texture );
1514+ }
14881515#ifdef SDL_HAVE_YUV
1489- SDL_ReleaseGPUTexture (renderdata -> device , data -> textureU );
1490- SDL_ReleaseGPUTexture (renderdata -> device , data -> textureV );
1491- SDL_ReleaseGPUTexture (renderdata -> device , data -> textureNV );
1516+ if (!data -> external_texture_u ) {
1517+ SDL_ReleaseGPUTexture (renderdata -> device , data -> textureU );
1518+ }
1519+ if (!data -> external_texture_v ) {
1520+ SDL_ReleaseGPUTexture (renderdata -> device , data -> textureV );
1521+ }
1522+ if (!data -> external_texture_nv ) {
1523+ SDL_ReleaseGPUTexture (renderdata -> device , data -> textureNV );
1524+ }
14921525#endif
14931526 SDL_free (data -> pixels );
14941527 SDL_free (data );
0 commit comments