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 <ian.d.romanick@intel.com>
This commit is contained in:
Kenneth Graunke 2013-01-23 15:27:39 -08:00 committed by Ian Romanick
parent 7638ede4ce
commit 9db2098d18
4 changed files with 21 additions and 7 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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) |