freedreno/ir3: find # of samplers from uniform vars
When we have indirect samplers, we cannot tell the max sampler referenced. Instead just refer to the number of sampler uniforms. Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
@@ -1028,7 +1028,7 @@ int ir3_ra(struct ir3 *ir3, gl_shader_stage type,
|
|||||||
bool frag_coord, bool frag_face);
|
bool frag_coord, bool frag_face);
|
||||||
|
|
||||||
/* legalize: */
|
/* legalize: */
|
||||||
void ir3_legalize(struct ir3 *ir, int *num_samp, bool *has_ssbo, int *max_bary);
|
void ir3_legalize(struct ir3 *ir, bool *has_ssbo, int *max_bary);
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
/* instruction helpers */
|
/* instruction helpers */
|
||||||
|
|||||||
@@ -2395,6 +2395,16 @@ emit_instructions(struct ir3_context *ctx)
|
|||||||
setup_output(ctx, var);
|
setup_output(ctx, var);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Find # of samplers: */
|
||||||
|
nir_foreach_variable(var, &ctx->s->uniforms) {
|
||||||
|
ctx->so->num_samp += glsl_type_get_sampler_count(var->type);
|
||||||
|
/* just assume that we'll be reading from images.. if it
|
||||||
|
* is write-only we don't have to count it, but not sure
|
||||||
|
* if there is a good way to know?
|
||||||
|
*/
|
||||||
|
ctx->so->num_samp += glsl_type_get_image_count(var->type);
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup registers (which should only be arrays): */
|
/* Setup registers (which should only be arrays): */
|
||||||
nir_foreach_register(reg, &ctx->s->registers) {
|
nir_foreach_register(reg, &ctx->s->registers) {
|
||||||
ir3_declare_array(ctx, reg);
|
ir3_declare_array(ctx, reg);
|
||||||
@@ -2700,7 +2710,7 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler,
|
|||||||
/* We need to do legalize after (for frag shader's) the "bary.f"
|
/* We need to do legalize after (for frag shader's) the "bary.f"
|
||||||
* offsets (inloc) have been assigned.
|
* offsets (inloc) have been assigned.
|
||||||
*/
|
*/
|
||||||
ir3_legalize(ir, &so->num_samp, &so->has_ssbo, &max_bary);
|
ir3_legalize(ir, &so->has_ssbo, &max_bary);
|
||||||
|
|
||||||
if (ir3_shader_debug & IR3_DBG_OPTMSGS) {
|
if (ir3_shader_debug & IR3_DBG_OPTMSGS) {
|
||||||
printf("AFTER LEGALIZE:\n");
|
printf("AFTER LEGALIZE:\n");
|
||||||
|
|||||||
@@ -41,7 +41,6 @@
|
|||||||
|
|
||||||
struct ir3_legalize_ctx {
|
struct ir3_legalize_ctx {
|
||||||
struct ir3_compiler *compiler;
|
struct ir3_compiler *compiler;
|
||||||
int num_samp;
|
|
||||||
bool has_ssbo;
|
bool has_ssbo;
|
||||||
int max_bary;
|
int max_bary;
|
||||||
};
|
};
|
||||||
@@ -218,14 +217,6 @@ legalize_block(struct ir3_legalize_ctx *ctx, struct ir3_block *block)
|
|||||||
regmask_set(&state->needs_ss, n->regs[0]);
|
regmask_set(&state->needs_ss, n->regs[0]);
|
||||||
|
|
||||||
if (is_tex(n)) {
|
if (is_tex(n)) {
|
||||||
/* this ends up being the # of samp instructions.. but that
|
|
||||||
* is ok, everything else only cares whether it is zero or
|
|
||||||
* not. We do this here, rather than when we encounter a
|
|
||||||
* SAMP decl, because (especially in binning pass shader)
|
|
||||||
* the samp instruction(s) could get eliminated if the
|
|
||||||
* result is not used.
|
|
||||||
*/
|
|
||||||
ctx->num_samp = MAX2(ctx->num_samp, n->cat5.samp + 1);
|
|
||||||
regmask_set(&state->needs_sy, n->regs[0]);
|
regmask_set(&state->needs_sy, n->regs[0]);
|
||||||
} else if (n->opc == OPC_RESINFO) {
|
} else if (n->opc == OPC_RESINFO) {
|
||||||
regmask_set(&state->needs_ss, n->regs[0]);
|
regmask_set(&state->needs_ss, n->regs[0]);
|
||||||
@@ -480,7 +471,7 @@ mark_convergence_points(struct ir3 *ir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ir3_legalize(struct ir3 *ir, int *num_samp, bool *has_ssbo, int *max_bary)
|
ir3_legalize(struct ir3 *ir, bool *has_ssbo, int *max_bary)
|
||||||
{
|
{
|
||||||
struct ir3_legalize_ctx *ctx = rzalloc(ir, struct ir3_legalize_ctx);
|
struct ir3_legalize_ctx *ctx = rzalloc(ir, struct ir3_legalize_ctx);
|
||||||
bool progress;
|
bool progress;
|
||||||
@@ -501,7 +492,6 @@ ir3_legalize(struct ir3 *ir, int *num_samp, bool *has_ssbo, int *max_bary)
|
|||||||
}
|
}
|
||||||
} while (progress);
|
} while (progress);
|
||||||
|
|
||||||
*num_samp = ctx->num_samp;
|
|
||||||
*has_ssbo = ctx->has_ssbo;
|
*has_ssbo = ctx->has_ssbo;
|
||||||
*max_bary = ctx->max_bary;
|
*max_bary = ctx->max_bary;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user