diff options
author | Kenneth Graunke <[email protected]> | 2013-01-23 15:27:39 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2013-01-25 09:04:25 -0500 |
commit | 9db2098d18dd28cbb4f9f98ec9e8f9d579608c38 (patch) | |
tree | 9c5183267a16a1737de8f9c019ca9060f25d6cbd | |
parent | 7638ede4ceaa11d0c1209785144b5d7af4696c58 (diff) |
i965: Use GL_RED for DEPTH_TEXTURE_MODE in ES 3.0 for unsized formats.
Khronos has apparently decided that depth textures with sized formats
(allowed with ARB_internalformat_query or ES 3.0) should be treated as
GL_RED, while unsized formats (an existing feature) should be treated
as GL_INTENSITY for compatibility with ES 2.0.
Ian is proposing changes to ARB_internalformat_query which will make
this actually legal and consistent.
A similar problem exists with GL 4.2, but we're going to ignore that
for the time being.
Tested on Ivybridge: no Piglit regressions; fixes 4 es3conform tests:
- depth_texture_fbo
- depth_texture_fbo_clear
- depth_texture_teximage
- depth_texture_texsubimage
Reviewed-by: Ian Romanick <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_state.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_wm.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 18 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 5 |
4 files changed, 21 insertions, 7 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index c6b8219e6bb..d9708c14bb7 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -202,7 +202,8 @@ GLuint translate_tex_format(gl_format mesa_format, GLenum depth_mode, GLenum srgb_decode); -int brw_get_texture_swizzle(const struct gl_texture_object *t); +int brw_get_texture_swizzle(const struct gl_context *ctx, + const struct gl_texture_object *t); /* gen7_wm_surface_state.c */ uint32_t gen7_surface_tiling_mode(uint32_t tiling); diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c index 289156705a0..4b0446574ac 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.c +++ b/src/mesa/drivers/dri/i965/brw_wm.c @@ -316,7 +316,7 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx, * (except for GL_ALPHA); all other platforms need MOVs in the shader. */ if (!intel->is_haswell || alpha_depth) - key->swizzles[s] = brw_get_texture_swizzle(t); + key->swizzles[s] = brw_get_texture_swizzle(ctx, t); if (img->InternalFormat == GL_YCBCR_MESA) { key->yuvtex_mask |= 1 << s; diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c index b772ef64e48..7f7b7ebe2b0 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -30,6 +30,7 @@ */ +#include "main/context.h" #include "main/mtypes.h" #include "main/samplerobj.h" #include "program/prog_parameter.h" @@ -685,7 +686,8 @@ brw_get_surface_num_multisamples(unsigned num_samples) * swizzling. */ int -brw_get_texture_swizzle(const struct gl_texture_object *t) +brw_get_texture_swizzle(const struct gl_context *ctx, + const struct gl_texture_object *t) { const struct gl_texture_image *img = t->Image[0][t->BaseLevel]; @@ -701,7 +703,19 @@ brw_get_texture_swizzle(const struct gl_texture_object *t) if (img->_BaseFormat == GL_DEPTH_COMPONENT || img->_BaseFormat == GL_DEPTH_STENCIL) { - switch (t->DepthMode) { + GLenum depth_mode = t->DepthMode; + + /* In ES 3.0, DEPTH_TEXTURE_MODE is expected to be GL_RED for textures + * with depth component data specified with a sized internal format. + * Otherwise, it's left at the old default, GL_LUMINANCE. + */ + if (_mesa_is_gles3(ctx) && + img->InternalFormat != GL_DEPTH_COMPONENT && + img->InternalFormat != GL_DEPTH_STENCIL) { + depth_mode = GL_RED; + } + + switch (depth_mode) { case GL_ALPHA: swizzles[0] = SWIZZLE_ZERO; swizzles[1] = SWIZZLE_ZERO; diff --git a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c index 05e9e75841d..236d50c8bc3 100644 --- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c @@ -344,9 +344,8 @@ gen7_update_texture_surface(struct gl_context *ctx, (firstImage->_BaseFormat == GL_DEPTH_COMPONENT || firstImage->_BaseFormat == GL_DEPTH_STENCIL); - const int swizzle = - unlikely(alpha_depth) ? SWIZZLE_XYZW : brw_get_texture_swizzle(tObj); - + const int swizzle = unlikely(alpha_depth) + ? SWIZZLE_XYZW : brw_get_texture_swizzle(ctx, tObj); surf[7] = SET_FIELD(swizzle_to_scs(GET_SWZ(swizzle, 0)), GEN7_SURFACE_SCS_R) | |