i965: Lower textureGrad() for samplerCubeShadow.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 13 Feb 2013 05:51:16 +0000 (21:51 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 1 May 2013 17:42:51 +0000 (10:42 -0700)
commite2f887b243fd34ef82e4782a968baca485b07b15
treefd8e6d35f9f91dec26d27429bf95ff1de9f8d3ed
parent163b4da8745e02257fff7ad506bc830c55dab7e7
i965: Lower textureGrad() for samplerCubeShadow.

According to the Ivybridge PRM, Volume 4 Part 1, page 130, in the
section for the sample_d message: "The r coordinate contains the faceid,
and the r gradients are ignored by hardware."

This doesn't match GLSL, which provides gradients for all of the
coordinates.  So we would need to do some math to compute the face ID
before using sample_d.  We currently don't have any code to do that.

However, we do have a lowering pass that converts textureGrad to
textureLod, which solves this problem.  Since textureGrad on three
components is sufficiently obscure, it's not a performance path.

For now, only handle samplerCubeShadow; we need tests for samplerCube
and samplerCubeArray.

Fixes es3conform's shadow_comparison_frag test on Haswell.

NOTE: This is a candidate for stable branches.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_lower_texture_gradients.cpp
src/mesa/drivers/dri/i965/brw_shader.cpp