Zebediah Figura : vkd3d-shader: Introduce write_sm1_{src, dst}_register() helpers.

Alexandre Julliard julliard at winehq.org
Tue May 18 15:41:58 CDT 2021


Module: vkd3d
Branch: master
Commit: 9f73897725ea412c7a145722f20c5157a0bd0342
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=9f73897725ea412c7a145722f20c5157a0bd0342

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Sun May 16 12:47:52 2021 -0500

vkd3d-shader: Introduce write_sm1_{src, dst}_register() helpers.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d-shader/hlsl_codegen.c | 64 +++++++++++++++++++++-------------------
 1 file changed, 33 insertions(+), 31 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index b3d7d2c..7dd919b 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -1523,23 +1523,11 @@ static uint32_t sm1_encode_register_type(D3DSHADER_PARAM_REGISTER_TYPE type)
             | ((type << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2);
 }
 
-static uint32_t sm1_encode_dst(D3DSHADER_PARAM_REGISTER_TYPE type,
-        D3DSHADER_PARAM_DSTMOD_TYPE modifier, unsigned int writemask, unsigned int reg)
-{
-    return (1u << 31) | sm1_encode_register_type(type) | modifier | (writemask << 16) | reg;
-}
-
-static uint32_t sm1_encode_src(D3DSHADER_PARAM_REGISTER_TYPE type,
-        D3DSHADER_PARAM_SRCMOD_TYPE modifier, unsigned int swizzle, uint32_t reg)
-{
-    return (1u << 31) | sm1_encode_register_type(type) | modifier | (swizzle << 16) | reg;
-}
-
 struct sm1_instruction
 {
     D3DSHADER_INSTRUCTION_OPCODE_TYPE opcode;
 
-    struct
+    struct sm1_dst_register
     {
         D3DSHADER_PARAM_REGISTER_TYPE type;
         D3DSHADER_PARAM_DSTMOD_TYPE mod;
@@ -1547,7 +1535,7 @@ struct sm1_instruction
         uint32_t reg;
     } dst;
 
-    struct
+    struct sm1_src_register
     {
         D3DSHADER_PARAM_REGISTER_TYPE type;
         D3DSHADER_PARAM_SRCMOD_TYPE mod;
@@ -1559,6 +1547,20 @@ struct sm1_instruction
     unsigned int has_dst;
 };
 
+static void write_sm1_dst_register(struct bytecode_buffer *buffer, const struct sm1_dst_register *reg)
+{
+    assert(reg->writemask);
+    put_dword(buffer, (1u << 31) | sm1_encode_register_type(reg->type) | reg->mod | (reg->writemask << 16) | reg->reg);
+}
+
+static void write_sm1_src_register(struct bytecode_buffer *buffer,
+        const struct sm1_src_register *reg, unsigned int dst_writemask)
+{
+    unsigned int swizzle = map_swizzle(reg->swizzle, dst_writemask);
+
+    put_dword(buffer, (1u << 31) | sm1_encode_register_type(reg->type) | reg->mod | (swizzle << 16) | reg->reg);
+}
+
 static void write_sm1_instruction(struct hlsl_ctx *ctx, struct bytecode_buffer *buffer,
         const struct sm1_instruction *instr)
 {
@@ -1570,14 +1572,10 @@ static void write_sm1_instruction(struct hlsl_ctx *ctx, struct bytecode_buffer *
     put_dword(buffer, token);
 
     if (instr->has_dst)
-    {
-        assert(instr->dst.writemask);
-        put_dword(buffer, sm1_encode_dst(instr->dst.type, instr->dst.mod, instr->dst.writemask, instr->dst.reg));
-    }
+        write_sm1_dst_register(buffer, &instr->dst);
 
     for (i = 0; i < instr->src_count; ++i)
-        put_dword(buffer, sm1_encode_src(instr->srcs[i].type, instr->srcs[i].mod,
-                map_swizzle(instr->srcs[i].swizzle, instr->dst.writemask), instr->srcs[i].reg));
+        write_sm1_src_register(buffer, &instr->srcs[i], instr->dst.writemask);
 };
 
 static void write_sm1_constant_defs(struct hlsl_ctx *ctx, struct bytecode_buffer *buffer)
@@ -1587,16 +1585,18 @@ static void write_sm1_constant_defs(struct hlsl_ctx *ctx, struct bytecode_buffer
     for (i = 0; i < ctx->constant_defs.count; ++i)
     {
         uint32_t token = D3DSIO_DEF;
+        const struct sm1_dst_register reg =
+        {
+            .type = D3DSPR_CONST,
+            .writemask = VKD3DSP_WRITEMASK_ALL,
+            .reg = i,
+        };
 
         if (ctx->profile->major_version > 1)
             token |= 5 << D3DSI_INSTLENGTH_SHIFT;
         put_dword(buffer, token);
 
-        token = (1u << 31);
-        token |= sm1_encode_register_type(D3DSPR_CONST);
-        token |= D3DSP_WRITEMASK_ALL;
-        token |= i;
-        put_dword(buffer, token);
+        write_sm1_dst_register(buffer, &reg);
         for (x = 0; x < 4; ++x)
             put_float(buffer, ctx->constant_defs.values[i].f[x]);
     }
@@ -1605,12 +1605,12 @@ static void write_sm1_constant_defs(struct hlsl_ctx *ctx, struct bytecode_buffer
 static void write_sm1_semantic_dcl(struct hlsl_ctx *ctx, struct bytecode_buffer *buffer,
         const struct hlsl_ir_var *var, bool output)
 {
-    D3DSHADER_PARAM_REGISTER_TYPE type;
-    uint32_t token, usage_idx, reg_idx;
+    struct sm1_dst_register reg = {0};
+    uint32_t token, usage_idx;
     D3DDECLUSAGE usage;
     bool ret;
 
-    if (sm1_register_from_semantic(ctx, &var->semantic, output, &type, &reg_idx))
+    if (sm1_register_from_semantic(ctx, &var->semantic, output, &reg.type, &reg.reg))
     {
         usage = 0;
         usage_idx = 0;
@@ -1619,8 +1619,8 @@ static void write_sm1_semantic_dcl(struct hlsl_ctx *ctx, struct bytecode_buffer
     {
         ret = sm1_usage_from_semantic(&var->semantic, &usage, &usage_idx);
         assert(ret);
-        type = output ? D3DSPR_OUTPUT : D3DSPR_INPUT;
-        reg_idx = var->reg.id;
+        reg.type = output ? D3DSPR_OUTPUT : D3DSPR_INPUT;
+        reg.reg = var->reg.id;
     }
 
     token = D3DSIO_DCL;
@@ -1632,7 +1632,9 @@ static void write_sm1_semantic_dcl(struct hlsl_ctx *ctx, struct bytecode_buffer
     token |= usage << D3DSP_DCL_USAGE_SHIFT;
     token |= usage_idx << D3DSP_DCL_USAGEINDEX_SHIFT;
     put_dword(buffer, token);
-    put_dword(buffer, sm1_encode_dst(type, D3DSPDM_NONE, (1 << var->data_type->dimx) - 1, reg_idx));
+
+    reg.writemask = (1 << var->data_type->dimx) - 1;
+    write_sm1_dst_register(buffer, &reg);
 }
 
 static void write_sm1_semantic_dcls(struct hlsl_ctx *ctx, struct bytecode_buffer *buffer)




More information about the wine-cvs mailing list