diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/vc4/vc4_opt_copy_propagation.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c b/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c index b36bb4209a5..66b7c80a77d 100644 --- a/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c +++ b/src/gallium/drivers/vc4/vc4_opt_copy_propagation.c @@ -45,10 +45,22 @@ qir_opt_copy_propagation(struct vc4_compile *c) foreach(node, &c->instructions) { struct qinst *inst = (struct qinst *)node; + /* A single instruction can only read one uniform value. (It + * could maybe read the same uniform value in two operands, + * but that doesn't seem important to do). + */ + bool reads_a_uniform = false; + for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) { + if (inst->src[i].file == QFILE_UNIF) + reads_a_uniform = true; + } + for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) { int index = inst->src[i].index; if (inst->src[i].file == QFILE_TEMP && - movs[index].file == QFILE_TEMP) { + (movs[index].file == QFILE_TEMP || + (movs[index].file == QFILE_UNIF && + !reads_a_uniform))) { if (debug) { fprintf(stderr, "Copy propagate: "); qir_dump_inst(inst); @@ -56,6 +68,8 @@ qir_opt_copy_propagation(struct vc4_compile *c) } inst->src[i] = movs[index]; + if (movs[index].file == QFILE_UNIF) + reads_a_uniform = true; if (debug) { fprintf(stderr, "to: "); |