gallivm: honor d3d10 floating point rules for shadow comparisons

d3d10 specifies ordered comparisons for everything but not_equal which is
unordered (http://msdn.microsoft.com/en-us/library/windows/desktop/cc308050.aspx).
OpenGL probably doesn't care.

Reviewed-by: Zack Rusin <zackr@vmware.com>
This commit is contained in:
Roland Scheidegger 2013-08-07 20:51:52 +02:00
parent aa84f1ad55
commit 6ce54a81b2
1 changed files with 17 additions and 3 deletions

View File

@ -1484,12 +1484,26 @@ lp_build_sample_compare(struct lp_build_sample_context *bld,
* should be converted to the depth format (quantization!) and comparison
* then done in texture format.
*/
/* result = (p FUNC texel) ? 1 : 0 */
res = lp_build_cmp(texel_bld, bld->static_sampler_state->compare_func,
p, texel[chan]);
/*
* honor d3d10 floating point rules here, which state that comparisons
* are ordered except NOT_EQUAL which is unordered.
*/
if (bld->static_sampler_state->compare_func != PIPE_FUNC_NOTEQUAL) {
res = lp_build_cmp_ordered(texel_bld, bld->static_sampler_state->compare_func,
p, texel[chan]);
}
else {
res = lp_build_cmp(texel_bld, bld->static_sampler_state->compare_func,
p, texel[chan]);
}
res = lp_build_select(texel_bld, res, texel_bld->one, texel_bld->zero);
/* XXX returning result for default GL_DEPTH_TEXTURE_MODE = GL_LUMINANCE */
/*
* returning result for default GL_DEPTH_TEXTURE_MODE = GL_LUMINANCE.
* This should be ok because sampler swizzle is applied on top of it.
*/
texel[0] =
texel[1] =
texel[2] = res;