diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c index ed7a01a4e6839967c5f81a46a5c179a33691275c..8e0f8cbdd53f119e41aa59742e96f1caa17e8607 100644 --- a/libs/vkd3d-shader/dxbc.c +++ b/libs/vkd3d-shader/dxbc.c @@ -812,6 +812,7 @@ static const struct vkd3d_sm4_opcode_info opcode_table[] = shader_sm4_read_declaration_count}, {VKD3D_SM5_OP_DDIV, VKD3DSIH_DDIV, "d", "dd"}, {VKD3D_SM5_OP_DFMA, VKD3DSIH_DFMA, "d", "ddd"}, + {VKD3D_SM5_OP_DRCP, VKD3DSIH_DRCP, "d", "d"}, }; static const enum vkd3d_shader_register_type register_type_table[] = diff --git a/libs/vkd3d-shader/sm4.h b/libs/vkd3d-shader/sm4.h index aba7d276740d6a2ec0dff106a97c160a0187b031..0c56a0cd4ee6fc79aa7c1fd3ef2e9d7958e715cb 100644 --- a/libs/vkd3d-shader/sm4.h +++ b/libs/vkd3d-shader/sm4.h @@ -331,6 +331,7 @@ enum vkd3d_sm4_opcode VKD3D_SM5_OP_DCL_GS_INSTANCES = 0xce, VKD3D_SM5_OP_DDIV = 0xd2, VKD3D_SM5_OP_DFMA = 0xd3, + VKD3D_SM5_OP_DRCP = 0xd4, }; enum vkd3d_sm4_instruction_modifier diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 3db100e1124cc20b039ef3939353d30a6ef1c160..37c3b31032daca458b79e6a4d8c00d0478f01d63 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -7078,15 +7078,18 @@ static void vkd3d_dxbc_compiler_emit_rcp(struct vkd3d_dxbc_compiler *compiler, struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; const struct vkd3d_shader_dst_param *dst = instruction->dst; const struct vkd3d_shader_src_param *src = instruction->src; - uint32_t type_id, src_id, val_id; + uint32_t type_id, src_id, val_id, div_id; unsigned int component_count; component_count = vkd3d_write_mask_component_count(dst->write_mask); 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); + if (src->reg.data_type == VKD3D_DATA_DOUBLE) + div_id = vkd3d_dxbc_compiler_get_constant_double_vector(compiler, 1.0, component_count); + else + div_id = vkd3d_dxbc_compiler_get_constant_float_vector(compiler, 1.0f, component_count); + val_id = vkd3d_spirv_build_op_fdiv(builder, type_id, div_id, src_id); vkd3d_dxbc_compiler_emit_store_dst(compiler, dst, val_id); } @@ -9568,6 +9571,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 a7294307259f61b6476057c3cb3b9c5cf34bc48b..2af3a76986a67f7c0116f8a8855a5064659ffb61 100644 --- a/libs/vkd3d-shader/trace.c +++ b/libs/vkd3d-shader/trace.c @@ -119,6 +119,7 @@ static const char * const shader_opcode_names[] = /* VKD3DSIH_DP2ADD */ "dp2add", /* VKD3DSIH_DP3 */ "dp3", /* VKD3DSIH_DP4 */ "dp4", + /* VKD3DSIH_DRCP */ "drcp", /* VKD3DSIH_DST */ "dst", /* VKD3DSIH_DSX */ "dsx", /* VKD3DSIH_DSX_COARSE */ "deriv_rtx_coarse", diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 56a4dde52d34dd64404a16dda55fcc00118fa12f..94daa08f79c308773b456ed31fbcb0ccca2b5798 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -208,6 +208,7 @@ enum vkd3d_shader_opcode VKD3DSIH_DP2ADD, VKD3DSIH_DP3, VKD3DSIH_DP4, + VKD3DSIH_DRCP, VKD3DSIH_DST, VKD3DSIH_DSX, VKD3DSIH_DSX_COARSE, diff --git a/tests/d3d12.c b/tests/d3d12.c index e7a273e69273e45462845c5ecc9ebffe17e34e77..b8d53424bc50115a399da99a1ac3e0be1cb35128 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -10010,7 +10010,7 @@ static void test_shader_instructions(void) {&ps_dmul, {.d = {{ 1.5, 3.0}}}, {.d = { 4.5, -4.5}}, true}, {&ps_ddiv, {.d = {{ 2.0, 4.0}}}, {.d = { 0.5, 2.0}}, true}, {&ps_ddiv, {.d = {{ 2.0, -4.0}}}, {.d = {-0.5, -2.0}}, true}, - {&ps_drcp, {.d = {{ 2.0, -0.5}}}, {.d = { 0.5, -2.0}}, true, true}, + {&ps_drcp, {.d = {{ 2.0, -0.5}}}, {.d = { 0.5, -2.0}}, true}, { &ps_swapc0,