radeonsi: Don't export unused clip distance vectors from vertex shader
E.g. the Source engine seems to always write to gl_ClipVertex, but normally doesn't enable any GL_CLIP_DISTANCEn states. This change removes some irrelevant parts from the generated vertex shader code in such cases. Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
This commit is contained in:
parent
b00269aa58
commit
2f98dc223f
|
@ -565,6 +565,7 @@ static void si_llvm_emit_clipvertex(struct lp_build_tgsi_context * bld_base,
|
||||||
LLVMValueRef (*pos)[9], unsigned index)
|
LLVMValueRef (*pos)[9], unsigned index)
|
||||||
{
|
{
|
||||||
struct si_shader_context *si_shader_ctx = si_shader_context(bld_base);
|
struct si_shader_context *si_shader_ctx = si_shader_context(bld_base);
|
||||||
|
struct si_pipe_shader *shader = si_shader_ctx->shader;
|
||||||
struct lp_build_context *base = &bld_base->base;
|
struct lp_build_context *base = &bld_base->base;
|
||||||
struct lp_build_context *uint = &si_shader_ctx->radeon_bld.soa.bld_base.uint_bld;
|
struct lp_build_context *uint = &si_shader_ctx->radeon_bld.soa.bld_base.uint_bld;
|
||||||
unsigned reg_index;
|
unsigned reg_index;
|
||||||
|
@ -583,6 +584,11 @@ static void si_llvm_emit_clipvertex(struct lp_build_tgsi_context * bld_base,
|
||||||
for (reg_index = 0; reg_index < 2; reg_index ++) {
|
for (reg_index = 0; reg_index < 2; reg_index ++) {
|
||||||
LLVMValueRef *args = pos[2 + reg_index];
|
LLVMValueRef *args = pos[2 + reg_index];
|
||||||
|
|
||||||
|
if (!(shader->key.vs.ucps_enabled & (1 << reg_index)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
shader->shader.clip_dist_write |= 0xf << (4 * reg_index);
|
||||||
|
|
||||||
args[5] =
|
args[5] =
|
||||||
args[6] =
|
args[6] =
|
||||||
args[7] =
|
args[7] =
|
||||||
|
@ -709,13 +715,15 @@ handle_semantic:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TGSI_SEMANTIC_CLIPDIST:
|
case TGSI_SEMANTIC_CLIPDIST:
|
||||||
|
if (!(si_shader_ctx->shader->key.vs.ucps_enabled &
|
||||||
|
(1 << d->Semantic.Index)))
|
||||||
|
continue;
|
||||||
shader->clip_dist_write |=
|
shader->clip_dist_write |=
|
||||||
d->Declaration.UsageMask << (d->Semantic.Index << 2);
|
d->Declaration.UsageMask << (d->Semantic.Index << 2);
|
||||||
target = V_008DFC_SQ_EXP_POS + 2 + d->Semantic.Index;
|
target = V_008DFC_SQ_EXP_POS + 2 + d->Semantic.Index;
|
||||||
break;
|
break;
|
||||||
case TGSI_SEMANTIC_CLIPVERTEX:
|
case TGSI_SEMANTIC_CLIPVERTEX:
|
||||||
si_llvm_emit_clipvertex(bld_base, pos_args, index);
|
si_llvm_emit_clipvertex(bld_base, pos_args, index);
|
||||||
shader->clip_dist_write = 0xFF;
|
|
||||||
continue;
|
continue;
|
||||||
case TGSI_SEMANTIC_FOG:
|
case TGSI_SEMANTIC_FOG:
|
||||||
case TGSI_SEMANTIC_GENERIC:
|
case TGSI_SEMANTIC_GENERIC:
|
||||||
|
|
|
@ -128,6 +128,7 @@ union si_shader_key {
|
||||||
} ps;
|
} ps;
|
||||||
struct {
|
struct {
|
||||||
unsigned instance_divisors[PIPE_MAX_ATTRIBS];
|
unsigned instance_divisors[PIPE_MAX_ATTRIBS];
|
||||||
|
unsigned ucps_enabled:2;
|
||||||
} vs;
|
} vs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2040,6 +2040,10 @@ static INLINE void si_shader_selector_key(struct pipe_context *ctx,
|
||||||
for (i = 0; i < rctx->vertex_elements->count; ++i)
|
for (i = 0; i < rctx->vertex_elements->count; ++i)
|
||||||
key->vs.instance_divisors[i] = rctx->vertex_elements->elements[i].instance_divisor;
|
key->vs.instance_divisors[i] = rctx->vertex_elements->elements[i].instance_divisor;
|
||||||
|
|
||||||
|
if (rctx->queued.named.rasterizer->clip_plane_enable & 0xf0)
|
||||||
|
key->vs.ucps_enabled |= 0x2;
|
||||||
|
if (rctx->queued.named.rasterizer->clip_plane_enable & 0xf)
|
||||||
|
key->vs.ucps_enabled |= 0x1;
|
||||||
} else if (sel->type == PIPE_SHADER_FRAGMENT) {
|
} else if (sel->type == PIPE_SHADER_FRAGMENT) {
|
||||||
if (sel->fs_write_all)
|
if (sel->fs_write_all)
|
||||||
key->ps.nr_cbufs = rctx->framebuffer.nr_cbufs;
|
key->ps.nr_cbufs = rctx->framebuffer.nr_cbufs;
|
||||||
|
|
Loading…
Reference in New Issue