[PATCH vkd3d 6/9] vkd3d-shader: Implement DMOV, DMOVC, DADD, DDIV, DMUL and DRCP.

Conor McCarthy cmccarthy at codeweavers.com
Sun Jun 13 22:26:40 CDT 2021


From: Joshua Ashton <joshua at froggi.es>
Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d-shader/dxbc.c                 | 12 ++++++++++++
 libs/vkd3d-shader/spirv.c                | 23 +++++++++++++++++++----
 libs/vkd3d-shader/trace.c                |  6 ++++++
 libs/vkd3d-shader/vkd3d_shader_private.h |  7 +++++++
 4 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index 782aed13..d23dfcad 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -310,9 +310,15 @@ enum vkd3d_sm4_opcode
     VKD3D_SM5_OP_IMM_ATOMIC_UMAX                  = 0xbc,
     VKD3D_SM5_OP_IMM_ATOMIC_UMIN                  = 0xbd,
     VKD3D_SM5_OP_SYNC                             = 0xbe,
+    VKD3D_SM5_OP_DADD                             = 0xbf,
+    VKD3D_SM5_OP_DMUL                             = 0xc2,
+    VKD3D_SM5_OP_DMOV                             = 0xc7,
+    VKD3D_SM5_OP_DMOVC                            = 0xc8,
     VKD3D_SM5_OP_EVAL_SAMPLE_INDEX                = 0xcc,
     VKD3D_SM5_OP_EVAL_CENTROID                    = 0xcd,
     VKD3D_SM5_OP_DCL_GS_INSTANCES                 = 0xce,
+    VKD3D_SM5_OP_DDIV                             = 0xd2,
+    VKD3D_SM5_OP_DRCP                             = 0xd4,
 };
 
 enum vkd3d_sm4_instruction_modifier
@@ -1236,6 +1242,12 @@ static const struct vkd3d_sm4_opcode_info opcode_table[] =
     {VKD3D_SM5_OP_EVAL_CENTROID,                    VKD3DSIH_EVAL_CENTROID,                    "f",    "f"},
     {VKD3D_SM5_OP_DCL_GS_INSTANCES,                 VKD3DSIH_DCL_GS_INSTANCES,                 "",     "",
             shader_sm4_read_declaration_count},
+    {VKD3D_SM5_OP_DADD,                             VKD3DSIH_DADD,                             "d",    "dd"},
+    {VKD3D_SM5_OP_DMUL,                             VKD3DSIH_DMUL,                             "d",    "dd"},
+    {VKD3D_SM5_OP_DMOV,                             VKD3DSIH_DMOV,                             "d",    "d"},
+    {VKD3D_SM5_OP_DMOVC,                            VKD3DSIH_DMOVC,                            "d",    "udd"},
+    {VKD3D_SM5_OP_DDIV,                             VKD3DSIH_DDIV,                             "d",    "dd"},
+    {VKD3D_SM5_OP_DRCP,                             VKD3DSIH_DRCP,                             "d",    "d"},
 };
 
 static const enum vkd3d_shader_register_type register_type_table[] =
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index c2826445..f4cfd80d 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -6543,10 +6543,12 @@ static SpvOp vkd3d_dxbc_compiler_map_alu_instruction(const struct vkd3d_shader_i
     }
     alu_ops[] =
     {
+        {VKD3DSIH_DADD,       SpvOpFAdd},
         {VKD3DSIH_ADD,        SpvOpFAdd},
         {VKD3DSIH_AND,        SpvOpBitwiseAnd},
         {VKD3DSIH_BFREV,      SpvOpBitReverse},
         {VKD3DSIH_COUNTBITS,  SpvOpBitCount},
+        {VKD3DSIH_DDIV,       SpvOpFDiv},
         {VKD3DSIH_DIV,        SpvOpFDiv},
         {VKD3DSIH_FTOI,       SpvOpConvertFToS},
         {VKD3DSIH_FTOU,       SpvOpConvertFToU},
@@ -6555,6 +6557,7 @@ static SpvOp vkd3d_dxbc_compiler_map_alu_instruction(const struct vkd3d_shader_i
         {VKD3DSIH_ISHL,       SpvOpShiftLeftLogical},
         {VKD3DSIH_ISHR,       SpvOpShiftRightArithmetic},
         {VKD3DSIH_ITOF,       SpvOpConvertSToF},
+        {VKD3DSIH_DMUL,       SpvOpFMul},
         {VKD3DSIH_MUL,        SpvOpFMul},
         {VKD3DSIH_NOT,        SpvOpNot},
         {VKD3DSIH_OR,         SpvOpBitwiseOr},
@@ -6758,14 +6761,20 @@ static void vkd3d_dxbc_compiler_emit_movc(struct vkd3d_dxbc_compiler *compiler,
     const struct vkd3d_shader_dst_param *dst = instruction->dst;
     const struct vkd3d_shader_src_param *src = instruction->src;
     uint32_t condition_id, src1_id, src2_id, type_id, val_id;
+    DWORD condition_mask = dst->write_mask;
     unsigned int component_count;
 
-    condition_id = vkd3d_dxbc_compiler_emit_load_src(compiler, &src[0], dst->write_mask);
+    if (instruction->handler_idx == VKD3DSIH_DMOVC)
+        condition_mask = (condition_mask & VKD3DSP_WRITEMASK_0) | ((condition_mask & VKD3DSP_WRITEMASK_2) >> 1);
+
+    condition_id = vkd3d_dxbc_compiler_emit_load_src(compiler, &src[0], condition_mask);
     src1_id = vkd3d_dxbc_compiler_emit_load_src(compiler, &src[1], dst->write_mask);
     src2_id = vkd3d_dxbc_compiler_emit_load_src(compiler, &src[2], dst->write_mask);
 
     component_count = vkd3d_write_mask_component_count(dst->write_mask);
     type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_FLOAT, component_count);
+    component_count = vkd3d_write_mask_component_count_typed(dst->write_mask, dst->reg.data_type);
+    type_id = vkd3d_dxbc_compiler_get_type_id_for_dst(compiler, dst);
 
     condition_id = vkd3d_dxbc_compiler_emit_int_to_bool(compiler,
             VKD3D_SHADER_CONDITIONAL_OP_NZ, component_count, condition_id);
@@ -6850,12 +6859,12 @@ static void vkd3d_dxbc_compiler_emit_rcp(struct vkd3d_dxbc_compiler *compiler,
     uint32_t type_id, src_id, val_id;
     unsigned int component_count;
 
-    component_count = vkd3d_write_mask_component_count(dst->write_mask);
+    component_count = vkd3d_write_mask_component_count_typed(dst->write_mask, dst->reg.data_type);
     type_id = vkd3d_dxbc_compiler_get_type_id_for_dst(compiler, dst);
 
     src_id = vkd3d_dxbc_compiler_emit_load_src(compiler, src, dst->write_mask);
-    val_id = vkd3d_spirv_build_op_fdiv(builder, type_id,
-            vkd3d_dxbc_compiler_get_constant_float_vector(compiler, 1.0f, component_count), src_id);
+    val_id = vkd3d_spirv_build_op_fdiv(builder, type_id, vkd3d_dxbc_compiler_get_constant_float_vector(compiler,
+            1.0f, component_count, src->reg.data_type), src_id);
     vkd3d_dxbc_compiler_emit_store_dst(compiler, dst, val_id);
 }
 
@@ -9240,19 +9249,23 @@ int vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler,
         case VKD3DSIH_HS_JOIN_PHASE:
             vkd3d_dxbc_compiler_enter_shader_phase(compiler, instruction);
             break;
+        case VKD3DSIH_DMOV:
         case VKD3DSIH_MOV:
             vkd3d_dxbc_compiler_emit_mov(compiler, instruction);
             break;
+        case VKD3DSIH_DMOVC:
         case VKD3DSIH_MOVC:
             vkd3d_dxbc_compiler_emit_movc(compiler, instruction);
             break;
         case VKD3DSIH_SWAPC:
             vkd3d_dxbc_compiler_emit_swapc(compiler, instruction);
             break;
+        case VKD3DSIH_DADD:
         case VKD3DSIH_ADD:
         case VKD3DSIH_AND:
         case VKD3DSIH_BFREV:
         case VKD3DSIH_COUNTBITS:
+        case VKD3DSIH_DDIV:
         case VKD3DSIH_DIV:
         case VKD3DSIH_FTOI:
         case VKD3DSIH_FTOU:
@@ -9261,6 +9274,7 @@ int vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler,
         case VKD3DSIH_ISHL:
         case VKD3DSIH_ISHR:
         case VKD3DSIH_ITOF:
+        case VKD3DSIH_DMUL:
         case VKD3DSIH_MUL:
         case VKD3DSIH_NOT:
         case VKD3DSIH_OR:
@@ -9295,6 +9309,7 @@ int vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler,
         case VKD3DSIH_DP2:
             vkd3d_dxbc_compiler_emit_dot(compiler, instruction);
             break;
+        case VKD3DSIH_DRCP:
         case VKD3DSIH_RCP:
             vkd3d_dxbc_compiler_emit_rcp(compiler, instruction);
             break;
diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c
index dd12b896..3812b573 100644
--- a/libs/vkd3d-shader/trace.c
+++ b/libs/vkd3d-shader/trace.c
@@ -268,6 +268,12 @@ static const char * const shader_opcode_names[] =
     /* VKD3DSIH_USHR                             */ "ushr",
     /* VKD3DSIH_UTOF                             */ "utof",
     /* VKD3DSIH_XOR                              */ "xor",
+    /* VKD3DSIH_DADD                             */ "dadd",
+    /* VKD3DSIH_DMUL                             */ "dmul",
+    /* VKD3DSIH_DMOV                             */ "dmov",
+    /* VKD3DSIH_DMOVC                            */ "dmovc",
+    /* VKD3DSIH_DDIV                             */ "ddiv",
+    /* VKD3DSIH_DRCP                             */ "drcp",
 };
 
 static const struct
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index f7a3c60e..d0fd25ee 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -354,6 +354,13 @@ enum vkd3d_shader_opcode
     VKD3DSIH_UTOF,
     VKD3DSIH_XOR,
 
+    VKD3DSIH_DADD,
+    VKD3DSIH_DMUL,
+    VKD3DSIH_DMOV,
+    VKD3DSIH_DMOVC,
+    VKD3DSIH_DDIV,
+    VKD3DSIH_DRCP,
+
     VKD3DSIH_INVALID,
 };
 
-- 
2.31.1




More information about the wine-devel mailing list