entry = _mesa_hash_table_search(ht, key);
assert(entry);
- entry->data--;
+ entry->data = (void *)(((uintptr_t) entry->data) - 1);
if (entry->data == NULL)
_mesa_hash_table_remove(ht, entry);
}
{
if (inst->src[i].file != QFILE_UNIF)
return false;
- if (vir_has_implicit_uniform(inst))
- return i != vir_get_implicit_uniform_src(inst);
return true;
}
static uint32_t
vir_get_instruction_uniform_count(struct qinst *inst)
{
- uint32_t count = 0;
+ uint32_t count = vir_has_uniform(inst);
for (int i = 0; i < vir_get_nsrc(inst); i++) {
if (inst->src[i].file != QFILE_UNIF)
continue;
for (int i = 0; i < nsrc; i++) {
- if (is_lowerable_uniform(inst, i))
- add_uniform(ht, inst->src[i]);
+ add_uniform(ht, inst->src[i]);
}
}
*/
uint32_t max_count = 0;
uint32_t max_index = 0;
- struct hash_entry *entry;
hash_table_foreach(ht, entry) {
uint32_t count = (uintptr_t)entry->data;
uint32_t index = (uintptr_t)entry->key - 1;
* reference a temp instead.
*/
vir_for_each_block(block, c) {
- struct qinst *mov = NULL;
+ struct qreg temp = c->undef;
vir_for_each_inst(inst, block) {
uint32_t nsrc = vir_get_nsrc(inst);
if (count <= 1)
continue;
- /* If the block doesn't have a load of the
- * uniform yet, add it. We could potentially
- * do better and CSE MOVs from multiple blocks
- * into dominating blocks, except that may
- * cause troubles for register allocation.
- */
- if (!mov) {
- mov = vir_mul_inst(V3D_QPU_M_MOV,
- vir_get_temp(c),
- unif, c->undef);
- list_add(&mov->link,
- &block->instructions);
- c->defs[mov->dst.index] = mov;
- }
-
bool removed = false;
for (int i = 0; i < nsrc; i++) {
if (is_lowerable_uniform(inst, i) &&
inst->src[i].index == max_index) {
- inst->src[i].file =
- mov->dst.file;
- inst->src[i].index =
- mov->dst.index;
+ /* If the block doesn't have a
+ * load of the uniform yet,
+ * add it now. We could
+ * potentially do better and
+ * CSE MOVs from multiple
+ * blocks into dominating
+ * blocks, except that may
+ * cause troubles for register
+ * allocation.
+ */
+ if (temp.file == QFILE_NULL) {
+ c->cursor =
+ vir_before_inst(inst);
+ temp = vir_MOV(c, unif);
+ }
+
+ inst->src[i] = temp;
remove_uniform(ht, unif);
removed = true;
}