[PATCH vkd3d 2/5] vkd3d-shader: Allocate temporary registers for anonymous expressions.
Zebediah Figura
zfigura at codeweavers.com
Tue Mar 30 17:03:12 CDT 2021
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
libs/vkd3d-shader/hlsl.h | 1 +
libs/vkd3d-shader/hlsl_codegen.c | 13 +++++++++++++
2 files changed, 14 insertions(+)
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
index fa7709ef..664137ce 100644
--- a/libs/vkd3d-shader/hlsl.h
+++ b/libs/vkd3d-shader/hlsl.h
@@ -171,6 +171,7 @@ struct hlsl_ir_node
* true even for loops, since currently we can't have a reference to a
* value generated in an earlier iteration of the loop. */
unsigned int index, last_read;
+ struct hlsl_reg reg;
};
struct hlsl_src
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index 420e720f..42e8f86a 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -747,6 +747,19 @@ static void allocate_temp_registers_recurse(struct list *instrs, struct liveness
LIST_FOR_EACH_ENTRY(instr, instrs, struct hlsl_ir_node, entry)
{
+ if (!instr->reg.allocated && instr->last_read)
+ {
+ if (instr->data_type->reg_size > 1)
+ instr->reg = allocate_range(liveness, instr->index,
+ instr->last_read, instr->data_type->reg_size);
+ else
+ instr->reg = allocate_register(liveness, instr->index,
+ instr->last_read, instr->data_type->dimx);
+ TRACE("Allocated %s to anonymous expression @%u (liveness %u-%u).\n",
+ debug_register('r', instr->reg, instr->data_type),
+ instr->index, instr->index, instr->last_read);
+ }
+
switch (instr->type)
{
case HLSL_IR_ASSIGNMENT:
--
2.31.0
More information about the wine-devel
mailing list