From: Brian Paul Date: Mon, 9 Dec 2013 20:50:44 +0000 (-0800) Subject: svga: don't emit extraneous fs shadow code X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d6a8421f3b71c85d614aee4e47ba008af5444bfc;p=mesa.git svga: don't emit extraneous fs shadow code Depending on the depth texture format, we may or may not have to emit explicit fs code to do the shadow comparison. Before, we were emitting it more often than needed. v2: check the actual texture format rather than the screen->depth.z16 field. The screen->depth.z16, x8z24, s8z24 fields may not all be set to a consistent set of depth formats. Reviewed-by: José Fonseca --- diff --git a/src/gallium/drivers/svga/svga_state_fs.c b/src/gallium/drivers/svga/svga_state_fs.c index f418ebf45f9..51d0eb5bacb 100644 --- a/src/gallium/drivers/svga/svga_state_fs.c +++ b/src/gallium/drivers/svga/svga_state_fs.c @@ -33,6 +33,7 @@ #include "svga_context.h" #include "svga_state.h" #include "svga_cmd.h" +#include "svga_resource_texture.h" #include "svga_tgsi.h" #include "svga_hw_reg.h" @@ -226,9 +227,43 @@ make_fs_key(const struct svga_context *svga, idx = 0; for (i = 0; i < svga->curr.num_samplers; ++i) { - if (svga->curr.sampler[i]) { - key->tex[i].compare_mode = svga->curr.sampler[i]->compare_mode; - key->tex[i].compare_func = svga->curr.sampler[i]->compare_func; + if (svga->curr.sampler_views[i]) { + struct pipe_resource *tex = svga->curr.sampler_views[i]->texture; + struct svga_texture *stex = svga_texture(tex); + SVGA3dSurfaceFormat format = stex->key.format; + + if (format == SVGA3D_Z_D16 || + format == SVGA3D_Z_D24X8 || + format == SVGA3D_Z_D24S8) { + /* If we're sampling from a SVGA3D_Z_D16, SVGA3D_Z_D24X8, + * or SVGA3D_Z_D24S8 surface, we'll automatically get + * shadow comparison. But we only get LEQUAL mode. + * Set TEX_COMPARE_NONE here so we don't emit the extra FS + * code for shadow comparison. + */ + key->tex[i].compare_mode = PIPE_TEX_COMPARE_NONE; + key->tex[i].compare_func = PIPE_FUNC_NEVER; + /* These depth formats _only_ support comparison mode and + * not ordinary sampling so warn if the later is expected. + */ + if (svga->curr.sampler[i]->compare_mode != + PIPE_TEX_COMPARE_R_TO_TEXTURE) { + debug_warn_once("Unsupported shadow compare mode"); + } + /* The only supported comparison mode is LEQUAL */ + if (svga->curr.sampler[i]->compare_func != PIPE_FUNC_LEQUAL) { + debug_warn_once("Unsupported shadow compare function"); + } + } + else { + /* For other texture formats, just use the compare func/mode + * as-is. Should be no-ops for color textures. For depth + * textures, we do not get automatic depth compare. We have + * to do it ourselves in the shader. And we don't get PCF. + */ + key->tex[i].compare_mode = svga->curr.sampler[i]->compare_mode; + key->tex[i].compare_func = svga->curr.sampler[i]->compare_func; + } } }