Commit a76f024e authored by Sam Lantinga's avatar Sam Lantinga

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
parent 7023079a
...@@ -38,8 +38,11 @@ SDL_RenderDriver GLES2_RenderDriver = { ...@@ -38,8 +38,11 @@ SDL_RenderDriver GLES2_RenderDriver = {
{ {
"opengles2", "opengles2",
(SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC), (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC),
1, 4,
{SDL_PIXELFORMAT_ABGR8888}, {SDL_PIXELFORMAT_ABGR8888,
SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_RGB888,
SDL_PIXELFORMAT_BGR888},
0, 0,
0 0
} }
...@@ -111,7 +114,10 @@ typedef enum ...@@ -111,7 +114,10 @@ typedef enum
typedef enum typedef enum
{ {
GLES2_IMAGESOURCE_SOLID, GLES2_IMAGESOURCE_SOLID,
GLES2_IMAGESOURCE_TEXTURE GLES2_IMAGESOURCE_TEXTURE_ABGR,
GLES2_IMAGESOURCE_TEXTURE_ARGB,
GLES2_IMAGESOURCE_TEXTURE_RGB,
GLES2_IMAGESOURCE_TEXTURE_BGR
} GLES2_ImageSource; } GLES2_ImageSource;
typedef struct GLES2_DriverContext typedef struct GLES2_DriverContext
...@@ -272,6 +278,9 @@ GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture) ...@@ -272,6 +278,9 @@ GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
switch (texture->format) switch (texture->format)
{ {
case SDL_PIXELFORMAT_ABGR8888: case SDL_PIXELFORMAT_ABGR8888:
case SDL_PIXELFORMAT_ARGB8888:
case SDL_PIXELFORMAT_BGR888:
case SDL_PIXELFORMAT_RGB888:
format = GL_RGBA; format = GL_RGBA;
type = GL_UNSIGNED_BYTE; type = GL_UNSIGNED_BYTE;
break; break;
...@@ -635,7 +644,7 @@ GLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type, SDL_BlendMode b ...@@ -635,7 +644,7 @@ GLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type, SDL_BlendMode b
if (glGetError() != GL_NO_ERROR || !compileSuccessful) if (glGetError() != GL_NO_ERROR || !compileSuccessful)
{ {
char *info = NULL; char *info = NULL;
int length; int length = 0;
glGetShaderiv(entry->id, GL_INFO_LOG_LENGTH, &length); glGetShaderiv(entry->id, GL_INFO_LOG_LENGTH, &length);
if (length > 0) { if (length > 0) {
...@@ -701,9 +710,20 @@ GLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source, SDL_BlendM ...@@ -701,9 +710,20 @@ GLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source, SDL_BlendM
case GLES2_IMAGESOURCE_SOLID: case GLES2_IMAGESOURCE_SOLID:
ftype = GLES2_SHADER_FRAGMENT_SOLID_SRC; ftype = GLES2_SHADER_FRAGMENT_SOLID_SRC;
break; break;
case GLES2_IMAGESOURCE_TEXTURE: case GLES2_IMAGESOURCE_TEXTURE_ABGR:
ftype = GLES2_SHADER_FRAGMENT_TEXTURE_SRC; ftype = GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_SRC;
break; 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 */ /* Load the requested shaders */
...@@ -1015,7 +1035,21 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s ...@@ -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 */ /* Activate an appropriate shader and set the projection matrix */
blendMode = texture->blendMode; 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) if (GLES2_SelectProgram(renderer, sourceType, blendMode) < 0)
return -1; return -1;
......
...@@ -55,7 +55,7 @@ static const Uint8 GLES2_FragmentSrc_SolidSrc_[] = " \ ...@@ -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; \ precision mediump float; \
uniform sampler2D u_texture; \ uniform sampler2D u_texture; \
uniform vec4 u_modulation; \ uniform vec4 u_modulation; \
...@@ -68,6 +68,57 @@ static const Uint8 GLES2_FragmentSrc_TextureSrc_[] = " \ ...@@ -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 = { static const GLES2_ShaderInstance GLES2_VertexSrc_Default = {
GL_VERTEX_SHADER, GL_VERTEX_SHADER,
GLES2_SOURCE_SHADER, GLES2_SOURCE_SHADER,
...@@ -82,11 +133,32 @@ static const GLES2_ShaderInstance GLES2_FragmentSrc_SolidSrc = { ...@@ -82,11 +133,32 @@ static const GLES2_ShaderInstance GLES2_FragmentSrc_SolidSrc = {
GLES2_FragmentSrc_SolidSrc_ GLES2_FragmentSrc_SolidSrc_
}; };
static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureSrc = { static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureABGRSrc = {
GL_FRAGMENT_SHADER, GL_FRAGMENT_SHADER,
GLES2_SOURCE_SHADER, GLES2_SOURCE_SHADER,
sizeof(GLES2_FragmentSrc_TextureSrc_), sizeof(GLES2_FragmentSrc_TextureABGRSrc_),
GLES2_FragmentSrc_TextureSrc_ 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 = { ...@@ -404,7 +476,11 @@ static const GLES2_ShaderInstance GLES2_FragmentTegra_Modulated_TextureSrc = {
*************************************************************************************************/ *************************************************************************************************/
static GLES2_Shader GLES2_VertexShader_Default = { static GLES2_Shader GLES2_VertexShader_Default = {
#if GLES2_INCLUDE_NVIDIA_SHADERS
2, 2,
#else
1,
#endif
{ {
#if GLES2_INCLUDE_NVIDIA_SHADERS #if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_VertexTegra_Default, &GLES2_VertexTegra_Default,
...@@ -414,7 +490,11 @@ static GLES2_Shader GLES2_VertexShader_Default = { ...@@ -414,7 +490,11 @@ static GLES2_Shader GLES2_VertexShader_Default = {
}; };
static GLES2_Shader GLES2_FragmentShader_None_SolidSrc = { static GLES2_Shader GLES2_FragmentShader_None_SolidSrc = {
#if GLES2_INCLUDE_NVIDIA_SHADERS
2, 2,
#else
1,
#endif
{ {
#if GLES2_INCLUDE_NVIDIA_SHADERS #if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_None_SolidSrc, &GLES2_FragmentTegra_None_SolidSrc,
...@@ -424,7 +504,11 @@ static GLES2_Shader GLES2_FragmentShader_None_SolidSrc = { ...@@ -424,7 +504,11 @@ static GLES2_Shader GLES2_FragmentShader_None_SolidSrc = {
}; };
static GLES2_Shader GLES2_FragmentShader_Alpha_SolidSrc = { static GLES2_Shader GLES2_FragmentShader_Alpha_SolidSrc = {
#if GLES2_INCLUDE_NVIDIA_SHADERS
2, 2,
#else
1,
#endif
{ {
#if GLES2_INCLUDE_NVIDIA_SHADERS #if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Alpha_SolidSrc, &GLES2_FragmentTegra_Alpha_SolidSrc,
...@@ -434,7 +518,11 @@ static GLES2_Shader GLES2_FragmentShader_Alpha_SolidSrc = { ...@@ -434,7 +518,11 @@ static GLES2_Shader GLES2_FragmentShader_Alpha_SolidSrc = {
}; };
static GLES2_Shader GLES2_FragmentShader_Additive_SolidSrc = { static GLES2_Shader GLES2_FragmentShader_Additive_SolidSrc = {
#if GLES2_INCLUDE_NVIDIA_SHADERS
2, 2,
#else
1,
#endif
{ {
#if GLES2_INCLUDE_NVIDIA_SHADERS #if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Additive_SolidSrc, &GLES2_FragmentTegra_Additive_SolidSrc,
...@@ -444,7 +532,11 @@ static GLES2_Shader GLES2_FragmentShader_Additive_SolidSrc = { ...@@ -444,7 +532,11 @@ static GLES2_Shader GLES2_FragmentShader_Additive_SolidSrc = {
}; };
static GLES2_Shader GLES2_FragmentShader_Modulated_SolidSrc = { static GLES2_Shader GLES2_FragmentShader_Modulated_SolidSrc = {
#if GLES2_INCLUDE_NVIDIA_SHADERS
2, 2,
#else
1,
#endif
{ {
#if GLES2_INCLUDE_NVIDIA_SHADERS #if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Modulated_SolidSrc, &GLES2_FragmentTegra_Modulated_SolidSrc,
...@@ -453,43 +545,143 @@ static GLES2_Shader GLES2_FragmentShader_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, 2,
#else
1,
#endif
{ {
#if GLES2_INCLUDE_NVIDIA_SHADERS #if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_None_TextureSrc, &GLES2_FragmentTegra_None_TextureSrc,
#endif #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, 2,
#else
1,
#endif
{ {
#if GLES2_INCLUDE_NVIDIA_SHADERS #if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Alpha_TextureSrc, &GLES2_FragmentTegra_Alpha_TextureSrc,
#endif #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, 2,
#else
1,
#endif
{ {
#if GLES2_INCLUDE_NVIDIA_SHADERS #if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Additive_TextureSrc, &GLES2_FragmentTegra_Additive_TextureSrc,
#endif #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, 2,
#else
1,
#endif
{ {
#if GLES2_INCLUDE_NVIDIA_SHADERS #if GLES2_INCLUDE_NVIDIA_SHADERS
&GLES2_FragmentTegra_Modulated_TextureSrc, &GLES2_FragmentTegra_Modulated_TextureSrc,
#endif #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
} }
}; };
...@@ -517,20 +709,65 @@ const GLES2_Shader *GLES2_GetShader(GLES2_ShaderType type, SDL_BlendMode blendMo ...@@ -517,20 +709,65 @@ const GLES2_Shader *GLES2_GetShader(GLES2_ShaderType type, SDL_BlendMode blendMo
default: default:
return NULL; return NULL;
} }
case GLES2_SHADER_FRAGMENT_TEXTURE_SRC: 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) switch (blendMode)
{ {
case SDL_BLENDMODE_NONE: case SDL_BLENDMODE_NONE:
return &GLES2_FragmentShader_None_TextureSrc; return &GLES2_FragmentShader_None_TextureARGBSrc;
case SDL_BLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
return &GLES2_FragmentShader_Alpha_TextureSrc; return &GLES2_FragmentShader_Alpha_TextureARGBSrc;
case SDL_BLENDMODE_ADD: case SDL_BLENDMODE_ADD:
return &GLES2_FragmentShader_Additive_TextureSrc; return &GLES2_FragmentShader_Additive_TextureARGBSrc;
case SDL_BLENDMODE_MOD: case SDL_BLENDMODE_MOD:
return &GLES2_FragmentShader_Modulated_TextureSrc; return &GLES2_FragmentShader_Modulated_TextureARGBSrc;
default: default:
return NULL; return NULL;
} }
case GLES2_SHADER_FRAGMENT_TEXTURE_RGB_SRC:
switch (blendMode)
{
case SDL_BLENDMODE_NONE:
return &GLES2_FragmentShader_None_TextureRGBSrc;
case SDL_BLENDMODE_BLEND:
return &GLES2_FragmentShader_Alpha_TextureRGBSrc;
case SDL_BLENDMODE_ADD:
return &GLES2_FragmentShader_Additive_TextureRGBSrc;
case SDL_BLENDMODE_MOD:
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: default:
return NULL; return NULL;
} }
......
...@@ -43,7 +43,10 @@ typedef enum ...@@ -43,7 +43,10 @@ typedef enum
{ {
GLES2_SHADER_VERTEX_DEFAULT, GLES2_SHADER_VERTEX_DEFAULT,
GLES2_SHADER_FRAGMENT_SOLID_SRC, 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; } GLES2_ShaderType;
#define GLES2_SOURCE_SHADER (GLenum)-1 #define GLES2_SOURCE_SHADER (GLenum)-1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment