summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Vorobiov <s.vorobiov@samsung.com>2014-03-20 11:07:09 +0400
committerStanislav Vorobiov <s.vorobiov@samsung.com>2014-03-21 09:49:01 +0400
commit57c951f4e2e0f4fe47015183e135afd6def137ae (patch)
tree30e491c5ce4a84fada66b6cdf5521f976e88aa7f
parentfdcfad9ed2784c3aaf3a2f420a64828ad1fd51c3 (diff)
downloademulator-yagl-57c951f4e2e0f4fe47015183e135afd6def137ae.tar.gz
emulator-yagl-57c951f4e2e0f4fe47015183e135afd6def137ae.tar.bz2
emulator-yagl-57c951f4e2e0f4fe47015183e135afd6def137ae.zip
YaGL: Fix sized GL_DEPTH_COMPONENT textures
Sized GL_DEPTH_COMPONENT textures are treated as luminance textures in desktop OpenGL, but according to OpenGL ES 3.0 they should be red, thus, we need to swizzle them. Also, when texture data is respecified we should unswizzle the texture when needed Change-Id: Ia1d5d3de860c04848a09bf84ac4a98f94466ea97 Signed-off-by: Stanislav Vorobiov <s.vorobiov@samsung.com>
-rw-r--r--GLES_common/yagl_gles_texture.c27
-rw-r--r--GLES_common/yagl_gles_texture.h1
2 files changed, 28 insertions, 0 deletions
diff --git a/GLES_common/yagl_gles_texture.c b/GLES_common/yagl_gles_texture.c
index dc0f0dd..0869d9b 100644
--- a/GLES_common/yagl_gles_texture.c
+++ b/GLES_common/yagl_gles_texture.c
@@ -21,18 +21,45 @@ static void yagl_gles_texture_swizzle(struct yagl_gles_texture *texture,
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_ZERO);
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_ZERO);
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
+ texture->is_swizzled = 1;
break;
case GL_LUMINANCE:
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_R, GL_RED);
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_RED);
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_RED);
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ONE);
+ texture->is_swizzled = 1;
break;
case GL_LUMINANCE_ALPHA:
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_R, GL_RED);
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_RED);
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_RED);
yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
+ texture->is_swizzled = 1;
+ break;
+ case GL_DEPTH_COMPONENT16:
+ case GL_DEPTH_COMPONENT24:
+ case GL_DEPTH_COMPONENT32:
+ case GL_DEPTH_COMPONENT32F:
+ case GL_DEPTH24_STENCIL8:
+ case GL_DEPTH32F_STENCIL8:
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_R, GL_RED);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_ZERO);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_ZERO);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ONE);
+ texture->is_swizzled = 1;
+ break;
+ default:
+ if (texture->is_swizzled) {
+ /*
+ * Unswizzle if it was swizzled.
+ */
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_R, GL_RED);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
+ texture->is_swizzled = 0;
+ }
break;
}
}
diff --git a/GLES_common/yagl_gles_texture.h b/GLES_common/yagl_gles_texture.h
index 6d1597b..f158851 100644
--- a/GLES_common/yagl_gles_texture.h
+++ b/GLES_common/yagl_gles_texture.h
@@ -19,6 +19,7 @@ struct yagl_gles_texture
GLenum internalformat;
int is_float;
+ int is_swizzled;
GLboolean immutable;