summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSam Lantinga <slouken@libsdl.org>2011-12-29 05:11:33 -0500
committerSam Lantinga <slouken@libsdl.org>2011-12-29 05:11:33 -0500
commit7103d68543769bff25c7adb1222031db3817a105 (patch)
treec938e8034860187021c62c1e9b48d848e00f9550 /src
parentdc5e3ffd5fab30b351c640c13d79a147a8c15e8d (diff)
Fixed bug 1335 - Added support for different pixel formats in OpenGL ES 2 renderer
Gueniffey 2011-11-23 04:06:31 PST The attached patch adds native support for SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888
Diffstat (limited to 'src')
-rw-r--r--src/render/opengles2/SDL_render_gles2.c48
-rw-r--r--src/render/opengles2/SDL_shaders_gles2.c287
-rw-r--r--src/render/opengles2/SDL_shaders_gles2.h5
3 files changed, 307 insertions, 33 deletions
diff --git a/src/render/opengles2/SDL_render_gles2.c b/src/render/opengles2/SDL_render_gles2.c
index 0122a298..54002e39 100644
--- a/src/render/opengles2/SDL_render_gles2.c
+++ b/src/render/opengles2/SDL_render_gles2.c
@@ -38,8 +38,11 @@ SDL_RenderDriver GLES2_RenderDriver = {
{
"opengles2",
(SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC),
- 1,
- {SDL_PIXELFORMAT_ABGR8888},
+ 4,
+ {SDL_PIXELFORMAT_ABGR8888,
+ SDL_PIXELFORMAT_ARGB8888,
+ SDL_PIXELFORMAT_RGB888,
+ SDL_PIXELFORMAT_BGR888},
0,
0
}
@@ -111,7 +114,10 @@ typedef enum
typedef enum
{
GLES2_IMAGESOURCE_SOLID,
- GLES2_IMAGESOURCE_TEXTURE
+ GLES2_IMAGESOURCE_TEXTURE_ABGR,
+ GLES2_IMAGESOURCE_TEXTURE_ARGB,
+ GLES2_IMAGESOURCE_TEXTURE_RGB,
+ GLES2_IMAGESOURCE_TEXTURE_BGR
} GLES2_ImageSource;
typedef struct GLES2_DriverContext
@@ -272,6 +278,9 @@ GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
switch (texture->format)
{
case SDL_PIXELFORMAT_ABGR8888:
+ case SDL_PIXELFORMAT_ARGB8888:
+ case SDL_PIXELFORMAT_BGR888:
+ case SDL_PIXELFORMAT_RGB888:
format = GL_RGBA;
type = GL_UNSIGNED_BYTE;
break;
@@ -635,7 +644,7 @@ GLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type, SDL_BlendMode b
if (glGetError() != GL_NO_ERROR || !compileSuccessful)
{
char *info = NULL;
- int length;
+ int length = 0;
glGetShaderiv(entry->id, GL_INFO_LOG_LENGTH, &length);
if (length > 0) {
@@ -701,9 +710,20 @@ GLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source, SDL_BlendM
case GLES2_IMAGESOURCE_SOLID:
ftype = GLES2_SHADER_FRAGMENT_SOLID_SRC;
break;
- case GLES2_IMAGESOURCE_TEXTURE:
- ftype = GLES2_SHADER_FRAGMENT_TEXTURE_SRC;
+ case GLES2_IMAGESOURCE_TEXTURE_ABGR:
+ ftype = GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_SRC;
+ break;
+ case GLES2_IMAGESOURCE_TEXTURE_ARGB:
+ ftype = GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_SRC;
+ break;
+ case GLES2_IMAGESOURCE_TEXTURE_RGB:
+ ftype = GLES2_SHADER_FRAGMENT_TEXTURE_RGB_SRC;
+ break;
+ case GLES2_IMAGESOURCE_TEXTURE_BGR:
+ ftype = GLES2_SHADER_FRAGMENT_TEXTURE_BGR_SRC;
break;
+ default:
+ goto fault;
}
/* Load the requested shaders */
@@ -1015,7 +1035,21 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
/* Activate an appropriate shader and set the projection matrix */
blendMode = texture->blendMode;
- sourceType = GLES2_IMAGESOURCE_TEXTURE;
+ switch (texture->format)
+ {
+ case SDL_PIXELFORMAT_ABGR8888:
+ sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;
+ break;
+ case SDL_PIXELFORMAT_ARGB8888:
+ sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;
+ break;
+ case SDL_PIXELFORMAT_BGR888:
+ sourceType = GLES2_IMAGESOURCE_TEXTURE_BGR;
+ break;
+ case SDL_PIXELFORMAT_RGB888:
+ sourceType = GLES2_IMAGESOURCE_TEXTURE_RGB;
+ break;
+ }
if (GLES2_SelectProgram(renderer, sourceType, blendMode) < 0)
return -1;
diff --git a/src/render/opengles2/SDL_shaders_gles2.c b/src/render/opengles2/SDL_shaders_gles2.c
index e82716b1..b7b32303 100644
--- a/src/render/opengles2/SDL_shaders_gles2.c
+++ b/src/render/opengles2/SDL_shaders_gles2.c
@@ -55,7 +55,7 @@ static const Uint8 GLES2_FragmentSrc_SolidSrc_[] = " \
} \
";
-static const Uint8 GLES2_FragmentSrc_TextureSrc_[] = " \
+static const Uint8 GLES2_FragmentSrc_TextureABGRSrc_[] = " \
precision mediump float; \
uniform sampler2D u_texture; \
uniform vec4 u_modulation; \
@@ -68,6 +68,57 @@ static const Uint8 GLES2_FragmentSrc_TextureSrc_[] = " \
} \
";
+// ARGB to ABGR conversion
+static const Uint8 GLES2_FragmentSrc_TextureARGBSrc_[] = " \
+ precision mediump float; \
+ uniform sampler2D u_texture; \
+ uniform vec4 u_modulation; \
+ varying vec2 v_texCoord; \
+ \
+ void main() \
+ { \
+ vec4 abgr = texture2D(u_texture, v_texCoord); \
+ gl_FragColor = abgr; \
+ gl_FragColor.r = abgr.b; \
+ gl_FragColor.b = abgr.r; \
+ gl_FragColor *= u_modulation; \
+ } \
+";
+
+// RGB to ABGR conversion
+static const Uint8 GLES2_FragmentSrc_TextureRGBSrc_[] = " \
+ precision mediump float; \
+ uniform sampler2D u_texture; \
+ uniform vec4 u_modulation; \
+ varying vec2 v_texCoord; \
+ \
+ void main() \
+ { \
+ vec4 abgr = texture2D(u_texture, v_texCoord); \
+ gl_FragColor = abgr; \
+ gl_FragColor.r = abgr.b; \
+ gl_FragColor.b = abgr.r; \
+ gl_FragColor.a = 1.0; \
+ gl_FragColor *= u_modulation; \
+ } \
+";
+
+// BGR to ABGR conversion
+static const Uint8 GLES2_FragmentSrc_TextureBGRSrc_[] = " \
+ precision mediump float; \
+ uniform sampler2D u_texture; \
+ uniform vec4 u_modulation; \
+ varying vec2 v_texCoord; \
+ \
+ void main() \
+ { \
+ vec4 abgr = texture2D(u_texture, v_texCoord); \
+ gl_FragColor = abgr; \
+ gl_FragColor.a = 1.0; \
+ gl_FragColor *= u_modulation; \
+ } \
+";
+
static const GLES2_ShaderInstance GLES2_VertexSrc_Default = {
GL_VERTEX_SHADER,
GLES2_SOURCE_SHADER,
@@ -82,11 +133,32 @@ static const GLES2_ShaderInstance GLES2_FragmentSrc_SolidSrc = {
GLES2_FragmentSrc_SolidSrc_
};
-static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureSrc = {
+static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureABGRSrc = {
GL_FRAGMENT_SHADER,
GLES2_SOURCE_SHADER,
- sizeof(GLES2_FragmentSrc_TextureSrc_),
- GLES2_FragmentSrc_TextureSrc_
+ sizeof(GLES2_FragmentSrc_TextureABGRSrc_),
+ GLES2_FragmentSrc_TextureABGRSrc_
+};
+
+static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureARGBSrc = {
+ GL_FRAGMENT_SHADER,
+ GLES2_SOURCE_SHADER,
+ sizeof(GLES2_FragmentSrc_TextureARGBSrc_),
+ GLES2_FragmentSrc_TextureARGBSrc_
+};
+
+static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureRGBSrc = {
+ GL_FRAGMENT_SHADER,
+ GLES2_SOURCE_SHADER,
+ sizeof(GLES2_FragmentSrc_TextureRGBSrc_),
+ GLES2_FragmentSrc_TextureRGBSrc_
+};
+
+static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureBGRSrc = {
+ GL_FRAGMENT_SHADER,
+ GLES2_SOURCE_SHADER,
+ sizeof(GLES2_FragmentSrc_TextureBGRSrc_),
+ GLES2_FragmentSrc_TextureBGRSrc_
};
/*************************************************************************************************
@@ -404,7 +476,11 @@ static const GLES2_ShaderInstance GLES2_FragmentTegra_Modulated_TextureSrc = {
*************************************************************************************************/
static GLES2_Shader GLES2_VertexShader_Default = {
+#if GLES2_INCLUDE_NVIDIA_SHADERS
2,
+#else
+ 1,
+#endif
{
#if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_VertexTegra_Default,
@@ -414,7 +490,11 @@ static GLES2_Shader GLES2_VertexShader_Default = {
};
static GLES2_Shader GLES2_FragmentShader_None_SolidSrc = {
+#if GLES2_INCLUDE_NVIDIA_SHADERS
2,
+#else
+ 1,
+#endif
{
#if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_None_SolidSrc,
@@ -424,7 +504,11 @@ static GLES2_Shader GLES2_FragmentShader_None_SolidSrc = {
};
static GLES2_Shader GLES2_FragmentShader_Alpha_SolidSrc = {
+#if GLES2_INCLUDE_NVIDIA_SHADERS
2,
+#else
+ 1,
+#endif
{
#if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Alpha_SolidSrc,
@@ -434,7 +518,11 @@ static GLES2_Shader GLES2_FragmentShader_Alpha_SolidSrc = {
};
static GLES2_Shader GLES2_FragmentShader_Additive_SolidSrc = {
+#if GLES2_INCLUDE_NVIDIA_SHADERS
2,
+#else
+ 1,
+#endif
{
#if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Additive_SolidSrc,
@@ -444,7 +532,11 @@ static GLES2_Shader GLES2_FragmentShader_Additive_SolidSrc = {
};
static GLES2_Shader GLES2_FragmentShader_Modulated_SolidSrc = {
+#if GLES2_INCLUDE_NVIDIA_SHADERS
2,
+#else
+ 1,
+#endif
{
#if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Modulated_SolidSrc,
@@ -453,43 +545,143 @@ static GLES2_Shader GLES2_FragmentShader_Modulated_SolidSrc = {
}
};
-static GLES2_Shader GLES2_FragmentShader_None_TextureSrc = {
+static GLES2_Shader GLES2_FragmentShader_None_TextureABGRSrc = {
+#if GLES2_INCLUDE_NVIDIA_SHADERS
2,
+#else
+ 1,
+#endif
{
#if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_None_TextureSrc,
#endif
- &GLES2_FragmentSrc_TextureSrc
+ &GLES2_FragmentSrc_TextureABGRSrc
}
};
-static GLES2_Shader GLES2_FragmentShader_Alpha_TextureSrc = {
+static GLES2_Shader GLES2_FragmentShader_Alpha_TextureABGRSrc = {
+#if GLES2_INCLUDE_NVIDIA_SHADERS
2,
+#else
+ 1,
+#endif
{
#if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Alpha_TextureSrc,
#endif
- &GLES2_FragmentSrc_TextureSrc
+ &GLES2_FragmentSrc_TextureABGRSrc
}
};
-static GLES2_Shader GLES2_FragmentShader_Additive_TextureSrc = {
+static GLES2_Shader GLES2_FragmentShader_Additive_TextureABGRSrc = {
+#if GLES2_INCLUDE_NVIDIA_SHADERS
2,
+#else
+ 1,
+#endif
{
#if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Additive_TextureSrc,
#endif
- &GLES2_FragmentSrc_TextureSrc
+ &GLES2_FragmentSrc_TextureABGRSrc
}
};
-static GLES2_Shader GLES2_FragmentShader_Modulated_TextureSrc = {
+static GLES2_Shader GLES2_FragmentShader_Modulated_TextureABGRSrc = {
+#if GLES2_INCLUDE_NVIDIA_SHADERS
2,
+#else
+ 1,
+#endif
{
#if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Modulated_TextureSrc,
#endif
- &GLES2_FragmentSrc_TextureSrc
+ &GLES2_FragmentSrc_TextureABGRSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_None_TextureARGBSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureARGBSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_Alpha_TextureARGBSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureARGBSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_Additive_TextureARGBSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureARGBSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_Modulated_TextureARGBSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureARGBSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_None_TextureRGBSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureRGBSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_Alpha_TextureRGBSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureRGBSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_Additive_TextureRGBSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureRGBSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_Modulated_TextureRGBSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureRGBSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_None_TextureBGRSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureBGRSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_Alpha_TextureBGRSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureBGRSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_Additive_TextureBGRSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureBGRSrc
+ }
+};
+
+static GLES2_Shader GLES2_FragmentShader_Modulated_TextureBGRSrc = {
+ 1,
+ {
+ &GLES2_FragmentSrc_TextureBGRSrc
}
};
@@ -504,33 +696,78 @@ const GLES2_Shader *GLES2_GetShader(GLES2_ShaderType type, SDL_BlendMode blendMo
case GLES2_SHADER_VERTEX_DEFAULT:
return &GLES2_VertexShader_Default;
case GLES2_SHADER_FRAGMENT_SOLID_SRC:
+ switch (blendMode)
+ {
+ case SDL_BLENDMODE_NONE:
+ return &GLES2_FragmentShader_None_SolidSrc;
+ case SDL_BLENDMODE_BLEND:
+ return &GLES2_FragmentShader_Alpha_SolidSrc;
+ case SDL_BLENDMODE_ADD:
+ return &GLES2_FragmentShader_Additive_SolidSrc;
+ case SDL_BLENDMODE_MOD:
+ return &GLES2_FragmentShader_Modulated_SolidSrc;
+ default:
+ return NULL;
+ }
+ case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_SRC:
+ switch (blendMode)
+ {
+ case SDL_BLENDMODE_NONE:
+ return &GLES2_FragmentShader_None_TextureABGRSrc;
+ case SDL_BLENDMODE_BLEND:
+ return &GLES2_FragmentShader_Alpha_TextureABGRSrc;
+ case SDL_BLENDMODE_ADD:
+ return &GLES2_FragmentShader_Additive_TextureABGRSrc;
+ case SDL_BLENDMODE_MOD:
+ return &GLES2_FragmentShader_Modulated_TextureABGRSrc;
+ default:
+ return NULL;
+ }
+ case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_SRC:
switch (blendMode)
- {
+ {
case SDL_BLENDMODE_NONE:
- return &GLES2_FragmentShader_None_SolidSrc;
+ return &GLES2_FragmentShader_None_TextureARGBSrc;
case SDL_BLENDMODE_BLEND:
- return &GLES2_FragmentShader_Alpha_SolidSrc;
+ return &GLES2_FragmentShader_Alpha_TextureARGBSrc;
case SDL_BLENDMODE_ADD:
- return &GLES2_FragmentShader_Additive_SolidSrc;
+ return &GLES2_FragmentShader_Additive_TextureARGBSrc;
case SDL_BLENDMODE_MOD:
- return &GLES2_FragmentShader_Modulated_SolidSrc;
+ return &GLES2_FragmentShader_Modulated_TextureARGBSrc;
default:
return NULL;
- }
- case GLES2_SHADER_FRAGMENT_TEXTURE_SRC:
+ }
+
+ case GLES2_SHADER_FRAGMENT_TEXTURE_RGB_SRC:
switch (blendMode)
- {
+ {
case SDL_BLENDMODE_NONE:
- return &GLES2_FragmentShader_None_TextureSrc;
+ return &GLES2_FragmentShader_None_TextureRGBSrc;
case SDL_BLENDMODE_BLEND:
- return &GLES2_FragmentShader_Alpha_TextureSrc;
+ return &GLES2_FragmentShader_Alpha_TextureRGBSrc;
case SDL_BLENDMODE_ADD:
- return &GLES2_FragmentShader_Additive_TextureSrc;
+ return &GLES2_FragmentShader_Additive_TextureRGBSrc;
case SDL_BLENDMODE_MOD:
- return &GLES2_FragmentShader_Modulated_TextureSrc;
+ return &GLES2_FragmentShader_Modulated_TextureRGBSrc;
default:
return NULL;
- }
+ }
+
+ case GLES2_SHADER_FRAGMENT_TEXTURE_BGR_SRC:
+ switch (blendMode)
+ {
+ case SDL_BLENDMODE_NONE:
+ return &GLES2_FragmentShader_None_TextureBGRSrc;
+ case SDL_BLENDMODE_BLEND:
+ return &GLES2_FragmentShader_Alpha_TextureBGRSrc;
+ case SDL_BLENDMODE_ADD:
+ return &GLES2_FragmentShader_Additive_TextureBGRSrc;
+ case SDL_BLENDMODE_MOD:
+ return &GLES2_FragmentShader_Modulated_TextureBGRSrc;
+ default:
+ return NULL;
+ }
+
default:
return NULL;
}
diff --git a/src/render/opengles2/SDL_shaders_gles2.h b/src/render/opengles2/SDL_shaders_gles2.h
index c34d7e58..ef482c4a 100644
--- a/src/render/opengles2/SDL_shaders_gles2.h
+++ b/src/render/opengles2/SDL_shaders_gles2.h
@@ -43,7 +43,10 @@ typedef enum
{
GLES2_SHADER_VERTEX_DEFAULT,
GLES2_SHADER_FRAGMENT_SOLID_SRC,
- GLES2_SHADER_FRAGMENT_TEXTURE_SRC
+ GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_SRC,
+ GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_SRC,
+ GLES2_SHADER_FRAGMENT_TEXTURE_BGR_SRC,
+ GLES2_SHADER_FRAGMENT_TEXTURE_RGB_SRC
} GLES2_ShaderType;
#define GLES2_SOURCE_SHADER (GLenum)-1