Fixed bug 3829 - Don't FOURCC format for target textures FOURCC isn't supported by renderer back-ends for target access So use a correct format and fallback to with native/yuv path
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index 0c6388f..8288b0f 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -1086,6 +1086,7 @@ SDL_Texture *
SDL_CreateTexture(SDL_Renderer * renderer, Uint32 format, int access, int w, int h)
{
SDL_Texture *texture;
+ SDL_bool texture_is_fourcc_and_target;
CHECK_RENDERER_MAGIC(renderer, NULL);
@@ -1131,15 +1132,24 @@ SDL_CreateTexture(SDL_Renderer * renderer, Uint32 format, int access, int w, int
}
renderer->textures = texture;
- if (IsSupportedFormat(renderer, format)) {
+ /* FOURCC format cannot be used directly by renderer back-ends for target texture */
+ texture_is_fourcc_and_target = (access == SDL_TEXTUREACCESS_TARGET && SDL_ISPIXELFORMAT_FOURCC(texture->format));
+
+ if (texture_is_fourcc_and_target == SDL_FALSE && IsSupportedFormat(renderer, format)) {
if (renderer->CreateTexture(renderer, texture) < 0) {
SDL_DestroyTexture(texture);
return NULL;
}
} else {
- texture->native = SDL_CreateTexture(renderer,
- GetClosestSupportedFormat(renderer, format),
- access, w, h);
+ int closest_format;
+
+ if (texture_is_fourcc_and_target == SDL_FALSE) {
+ closest_format = GetClosestSupportedFormat(renderer, format);
+ } else {
+ closest_format = renderer->info.texture_formats[0];
+ }
+
+ texture->native = SDL_CreateTexture(renderer, closest_format, access, w, h);
if (!texture->native) {
SDL_DestroyTexture(texture);
return NULL;