Zebediah Figura : vkd3d-shader: Write SM1 load instructions.
Alexandre Julliard
julliard at winehq.org
Tue May 18 15:41:58 CDT 2021
Module: vkd3d
Branch: master
Commit: 6e475814153ace7e5af3ac1cf478f3c33872d813
URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=6e475814153ace7e5af3ac1cf478f3c33872d813
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Sun May 16 12:47:54 2021 -0500
vkd3d-shader: Write SM1 load instructions.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
libs/vkd3d-shader/hlsl_codegen.c | 46 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index 10bf80b..05aea21 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -1663,6 +1663,48 @@ static void write_sm1_semantic_dcls(struct hlsl_ctx *ctx, struct bytecode_buffer
}
}
+static void write_sm1_load(struct hlsl_ctx *ctx, struct bytecode_buffer *buffer, const struct hlsl_ir_node *instr)
+{
+ const struct hlsl_ir_load *load = hlsl_ir_load(instr);
+ const struct hlsl_reg reg = hlsl_reg_from_deref(&load->src, instr->data_type);
+ struct sm1_instruction sm1_instr =
+ {
+ .opcode = D3DSIO_MOV,
+
+ .dst.type = D3DSPR_TEMP,
+ .dst.reg = instr->reg.id,
+ .dst.writemask = instr->reg.writemask,
+ .has_dst = 1,
+
+ .srcs[0].type = D3DSPR_TEMP,
+ .srcs[0].reg = reg.id,
+ .srcs[0].swizzle = swizzle_from_writemask(reg.writemask),
+ .src_count = 1,
+ };
+
+ assert(instr->reg.allocated);
+
+ if (load->src.var->is_uniform)
+ {
+ assert(reg.allocated);
+ sm1_instr.srcs[0].type = D3DSPR_CONST;
+ }
+ else if (load->src.var->is_input_semantic)
+ {
+ if (!sm1_register_from_semantic(ctx, &load->src.var->semantic,
+ false, &sm1_instr.srcs[0].type, &sm1_instr.srcs[0].reg))
+ {
+ assert(reg.allocated);
+ sm1_instr.srcs[0].type = D3DSPR_INPUT;
+ sm1_instr.srcs[0].reg = reg.id;
+ }
+ else
+ sm1_instr.srcs[0].swizzle = swizzle_from_writemask((1 << load->src.var->data_type->dimx) - 1);
+ }
+
+ write_sm1_instruction(ctx, buffer, &sm1_instr);
+}
+
static void write_sm1_store(struct hlsl_ctx *ctx, struct bytecode_buffer *buffer, const struct hlsl_ir_node *instr)
{
const struct hlsl_ir_store *store = hlsl_ir_store(instr);
@@ -1726,6 +1768,10 @@ static void write_sm1_instructions(struct hlsl_ctx *ctx, struct bytecode_buffer
switch (instr->type)
{
+ case HLSL_IR_LOAD:
+ write_sm1_load(ctx, buffer, instr);
+ break;
+
case HLSL_IR_STORE:
write_sm1_store(ctx, buffer, instr);
break;
More information about the wine-cvs
mailing list