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;
......
This diff is collapsed.
...@@ -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