Browse Source

opengles2: fixed swapped colors when using indexed textures

Sam Lantinga 3 weeks ago
parent
commit
c0a2ae2a4a

+ 16 - 3
src/render/opengles2/SDL_render_gles2.c

@@ -628,6 +628,7 @@ static bool GLES2_SelectProgram(GLES2_RenderData *data, SDL_Texture *texture, GL
     GLES2_ShaderType vtype, ftype;
     GLES2_ShaderType vtype, ftype;
     GLES2_ProgramCacheEntry *program;
     GLES2_ProgramCacheEntry *program;
     GLES2_TextureData *tdata = texture ? (GLES2_TextureData *)texture->internal : NULL;
     GLES2_TextureData *tdata = texture ? (GLES2_TextureData *)texture->internal : NULL;
+    const bool colorswap = (data->drawstate.target && (data->drawstate.target->format == SDL_PIXELFORMAT_BGRA32 || data->drawstate.target->format == SDL_PIXELFORMAT_BGRX32));
     const float *shader_params = NULL;
     const float *shader_params = NULL;
     int shader_params_len = 0;
     int shader_params_len = 0;
 
 
@@ -640,15 +641,27 @@ static bool GLES2_SelectProgram(GLES2_RenderData *data, SDL_Texture *texture, GL
     case GLES2_IMAGESOURCE_TEXTURE_INDEX8:
     case GLES2_IMAGESOURCE_TEXTURE_INDEX8:
         switch (scale_mode) {
         switch (scale_mode) {
         case SDL_SCALEMODE_NEAREST:
         case SDL_SCALEMODE_NEAREST:
-            ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST;
+            if (colorswap) {
+                ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST_COLORSWAP;
+            } else {
+                ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST;
+            }
             break;
             break;
         case SDL_SCALEMODE_LINEAR:
         case SDL_SCALEMODE_LINEAR:
-            ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR;
+            if (colorswap) {
+                ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR_COLORSWAP;
+            } else {
+                ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR;
+            }
             shader_params = tdata->texel_size;
             shader_params = tdata->texel_size;
             shader_params_len = 4 * sizeof(float);
             shader_params_len = 4 * sizeof(float);
             break;
             break;
         case SDL_SCALEMODE_PIXELART:
         case SDL_SCALEMODE_PIXELART:
-            ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART;
+            if (colorswap) {
+                ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART_COLORSWAP;
+            } else {
+                ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART;
+            }
             shader_params = tdata->texel_size;
             shader_params = tdata->texel_size;
             shader_params_len = 4 * sizeof(float);
             shader_params_len = 4 * sizeof(float);
             break;
             break;

+ 60 - 22
src/render/opengles2/SDL_shaders_gles2.c

@@ -167,7 +167,20 @@ static const char GLES2_Fragment_TexturePalette_Nearest[] =
 "\n"
 "\n"
 "void main()\n"
 "void main()\n"
 "{\n"
 "{\n"
-"    gl_FragColor = SamplePaletteNearest(v_texCoord);\n"
+"    mediump vec4 color = SamplePaletteNearest(v_texCoord);\n"
+"    gl_FragColor = color;\n"
+"    gl_FragColor *= v_color;\n"
+"}\n"
+;
+
+static const char GLES2_Fragment_TexturePalette_Nearest_Colorswap[] =
+    PALETTE_SHADER_PROLOGUE
+    PALETTE_SHADER_FUNCTIONS
+"\n"
+"void main()\n"
+"{\n"
+"    mediump vec4 color = SamplePaletteNearest(v_texCoord);\n"
+"    gl_FragColor = vec4(color.b, color.g, color.r, color.a);\n"
 "    gl_FragColor *= v_color;\n"
 "    gl_FragColor *= v_color;\n"
 "}\n"
 "}\n"
 ;
 ;
@@ -178,7 +191,20 @@ static const char GLES2_Fragment_TexturePalette_Linear[] =
 "\n"
 "\n"
 "void main()\n"
 "void main()\n"
 "{\n"
 "{\n"
-"    gl_FragColor = SamplePaletteLinear(v_texCoord);\n"
+"    mediump vec4 color = SamplePaletteLinear(v_texCoord);\n"
+"    gl_FragColor = color;\n"
+"    gl_FragColor *= v_color;\n"
+"}\n"
+;
+
+static const char GLES2_Fragment_TexturePalette_Linear_Colorswap[] =
+    PALETTE_SHADER_PROLOGUE
+    PALETTE_SHADER_FUNCTIONS
+"\n"
+"void main()\n"
+"{\n"
+"    mediump vec4 color = SamplePaletteLinear(v_texCoord);\n"
+"    gl_FragColor = vec4(color.b, color.g, color.r, color.a);\n"
 "    gl_FragColor *= v_color;\n"
 "    gl_FragColor *= v_color;\n"
 "}\n"
 "}\n"
 ;
 ;
@@ -191,10 +217,28 @@ static const char GLES2_Fragment_TexturePalette_PixelArt[] =
 "void main()\n"
 "void main()\n"
 "{\n"
 "{\n"
 #ifdef OPENGLES_300
 #ifdef OPENGLES_300
-"    gl_FragColor = SamplePaletteLinear(GetPixelArtUV(v_texCoord));\n"
+"    mediump vec4 color = SamplePaletteLinear(GetPixelArtUV(v_texCoord));\n"
 #else
 #else
-"    gl_FragColor = SamplePaletteNearest(v_texCoord);\n"
+"    mediump vec4 color = SamplePaletteNearest(v_texCoord);\n"
 #endif
 #endif
+"    gl_FragColor = color;\n"
+"    gl_FragColor *= v_color;\n"
+"}\n"
+;
+
+static const char GLES2_Fragment_TexturePalette_PixelArt_Colorswap[] =
+    PALETTE_SHADER_PROLOGUE
+    PALETTE_SHADER_FUNCTIONS
+    PIXELART_SHADER_FUNCTIONS
+"\n"
+"void main()\n"
+"{\n"
+#ifdef OPENGLES_300
+"    mediump vec4 color = SamplePaletteLinear(GetPixelArtUV(v_texCoord));\n"
+#else
+"    mediump vec4 color = SamplePaletteNearest(v_texCoord);\n"
+#endif
+"    gl_FragColor = vec4(color.b, color.g, color.r, color.a);\n"
 "    gl_FragColor *= v_color;\n"
 "    gl_FragColor *= v_color;\n"
 "}\n"
 "}\n"
 ;
 ;
@@ -206,10 +250,7 @@ static const char GLES2_Fragment_TextureRGB[] =
 "void main()\n"
 "void main()\n"
 "{\n"
 "{\n"
 "    mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
 "    mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
-"    gl_FragColor = color;\n"
-"    gl_FragColor.r = color.b;\n"
-"    gl_FragColor.b = color.r;\n"
-"    gl_FragColor.a = 1.0;\n"
+"    gl_FragColor = vec4(color.b, color.g, color.r, 1.0);\n"
 "    gl_FragColor *= v_color;\n"
 "    gl_FragColor *= v_color;\n"
 "}\n"
 "}\n"
 ;
 ;
@@ -222,10 +263,7 @@ static const char GLES2_Fragment_TextureRGB_PixelArt[] =
 "void main()\n"
 "void main()\n"
 "{\n"
 "{\n"
 "    mediump vec4 color = GetPixelArtSample(v_texCoord);\n"
 "    mediump vec4 color = GetPixelArtSample(v_texCoord);\n"
-"    gl_FragColor = color;\n"
-"    gl_FragColor.r = color.b;\n"
-"    gl_FragColor.b = color.r;\n"
-"    gl_FragColor.a = 1.0;\n"
+"    gl_FragColor = vec4(color.b, color.g, color.r, 1.0);\n"
 "    gl_FragColor *= v_color;\n"
 "    gl_FragColor *= v_color;\n"
 "}\n"
 "}\n"
 ;
 ;
@@ -237,8 +275,7 @@ static const char GLES2_Fragment_TextureBGR[] =
 "void main()\n"
 "void main()\n"
 "{\n"
 "{\n"
 "    mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
 "    mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
-"    gl_FragColor = color;\n"
-"    gl_FragColor.a = 1.0;\n"
+"    gl_FragColor = vec4(color.r, color.g, color.b, 1.0);\n"
 "    gl_FragColor *= v_color;\n"
 "    gl_FragColor *= v_color;\n"
 "}\n"
 "}\n"
 ;
 ;
@@ -251,8 +288,7 @@ static const char GLES2_Fragment_TextureBGR_PixelArt[] =
 "void main()\n"
 "void main()\n"
 "{\n"
 "{\n"
 "    mediump vec4 color = GetPixelArtSample(v_texCoord);\n"
 "    mediump vec4 color = GetPixelArtSample(v_texCoord);\n"
-"    gl_FragColor = color;\n"
-"    gl_FragColor.a = 1.0;\n"
+"    gl_FragColor = vec4(color.r, color.g, color.b, 1.0);\n"
 "    gl_FragColor *= v_color;\n"
 "    gl_FragColor *= v_color;\n"
 "}\n"
 "}\n"
 ;
 ;
@@ -264,9 +300,7 @@ static const char GLES2_Fragment_TextureARGB[] =
 "void main()\n"
 "void main()\n"
 "{\n"
 "{\n"
 "    mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
 "    mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
-"    gl_FragColor = color;\n"
-"    gl_FragColor.r = color.b;\n"
-"    gl_FragColor.b = color.r;\n"
+"    gl_FragColor = vec4(color.b, color.g, color.r, color.a);\n"
 "    gl_FragColor *= v_color;\n"
 "    gl_FragColor *= v_color;\n"
 "}\n"
 "}\n"
 ;
 ;
@@ -279,9 +313,7 @@ static const char GLES2_Fragment_TextureARGB_PixelArt[] =
 "void main()\n"
 "void main()\n"
 "{\n"
 "{\n"
 "    mediump vec4 color = GetPixelArtSample(v_texCoord);\n"
 "    mediump vec4 color = GetPixelArtSample(v_texCoord);\n"
-"    gl_FragColor = color;\n"
-"    gl_FragColor.r = color.b;\n"
-"    gl_FragColor.b = color.r;\n"
+"    gl_FragColor = vec4(color.b, color.g, color.r, color.a);\n"
 "    gl_FragColor *= v_color;\n"
 "    gl_FragColor *= v_color;\n"
 "}\n"
 "}\n"
 ;
 ;
@@ -524,6 +556,12 @@ const char *GLES2_GetShader(GLES2_ShaderType type)
         return GLES2_Fragment_TexturePalette_Linear;
         return GLES2_Fragment_TexturePalette_Linear;
     case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART:
     case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART:
         return GLES2_Fragment_TexturePalette_PixelArt;
         return GLES2_Fragment_TexturePalette_PixelArt;
+    case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST_COLORSWAP:
+        return GLES2_Fragment_TexturePalette_Nearest_Colorswap;
+    case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR_COLORSWAP:
+        return GLES2_Fragment_TexturePalette_Linear_Colorswap;
+    case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART_COLORSWAP:
+        return GLES2_Fragment_TexturePalette_PixelArt_Colorswap;
     case GLES2_SHADER_FRAGMENT_TEXTURE_RGB:
     case GLES2_SHADER_FRAGMENT_TEXTURE_RGB:
         return GLES2_Fragment_TextureRGB;
         return GLES2_Fragment_TextureRGB;
     case GLES2_SHADER_FRAGMENT_TEXTURE_RGB_PIXELART:
     case GLES2_SHADER_FRAGMENT_TEXTURE_RGB_PIXELART:

+ 3 - 0
src/render/opengles2/SDL_shaders_gles2.h

@@ -42,6 +42,9 @@ typedef enum
     GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST,
     GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST,
     GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR,
     GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR,
     GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART,
     GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART,
+    GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST_COLORSWAP,
+    GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR_COLORSWAP,
+    GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART_COLORSWAP,
     GLES2_SHADER_FRAGMENT_TEXTURE_RGB,
     GLES2_SHADER_FRAGMENT_TEXTURE_RGB,
     GLES2_SHADER_FRAGMENT_TEXTURE_RGB_PIXELART,
     GLES2_SHADER_FRAGMENT_TEXTURE_RGB_PIXELART,
     GLES2_SHADER_FRAGMENT_TEXTURE_BGR,
     GLES2_SHADER_FRAGMENT_TEXTURE_BGR,