X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fvc4%2Fvc4_opt_small_immediates.c;h=07eca71f23ecfb9987ceed8b379afecfe0d940f7;hb=4d61eb80187cd8e5984eed94f2ae3c7d6c3b3aa0;hp=4c105f37344253dd0f6cafc4cbba730f4b6e4cc5;hpb=d3cdbf6fd817ae5e7a8a72bcc3f43cc1b04a709b;p=mesa.git diff --git a/src/gallium/drivers/vc4/vc4_opt_small_immediates.c b/src/gallium/drivers/vc4/vc4_opt_small_immediates.c index 4c105f37344..07eca71f23e 100644 --- a/src/gallium/drivers/vc4/vc4_opt_small_immediates.c +++ b/src/gallium/drivers/vc4/vc4_opt_small_immediates.c @@ -45,14 +45,25 @@ qir_opt_small_immediates(struct vc4_compile *c) * elsewhere). */ bool uses_small_imm = false; - for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) { + for (int i = 0; i < qir_get_nsrc(inst); i++) { if (inst->src[i].file == QFILE_SMALL_IMM) uses_small_imm = true; } if (uses_small_imm) continue; - for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) { + /* Don't propagate small immediates into the top-end bounds + * checking for indirect UBO loads. The kernel doesn't parse + * small immediates and rejects the shader in this case. UBO + * loads are much more expensive than the uniform load, and + * indirect UBO regions are usually much larger than a small + * immediate, so it's not worth updating the kernel to allow + * optimizing it. + */ + if (inst->op == QOP_MIN_NOIMM) + continue; + + for (int i = 0; i < qir_get_nsrc(inst); i++) { struct qreg src = qir_follow_movs(c, inst->src[i]); if (src.file != QFILE_UNIF || @@ -62,11 +73,8 @@ qir_opt_small_immediates(struct vc4_compile *c) continue; } - if (i == 1 && - (inst->op == QOP_TEX_S || - inst->op == QOP_TEX_T || - inst->op == QOP_TEX_R || - inst->op == QOP_TEX_B)) { + if (qir_is_tex(inst) && + i == qir_get_tex_uniform_src(inst)) { /* No turning the implicit uniform read into * an immediate. */