From 93cd63bc9309bff2ad088020f7095c4c927b9613 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Thu, 2 May 2024 01:15:29 +0200 Subject: [PATCH] vkd3d-shader/glsl: Implement VKD3DSIH_DP3. --- libs/vkd3d-shader/glsl.c | 27 +++++++++++++++++++++++++++ tests/hlsl/determinant.shader_test | 4 ++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c index ec52e2d1..905e019d 100644 --- a/libs/vkd3d-shader/glsl.c +++ b/libs/vkd3d-shader/glsl.c @@ -428,6 +428,30 @@ static void shader_glsl_binop(struct vkd3d_glsl_generator *gen, glsl_dst_cleanup(&dst, &gen->string_buffers); } +static void shader_glsl_dot(struct vkd3d_glsl_generator *gen, + const struct vkd3d_shader_instruction *ins, uint32_t src_mask) +{ + unsigned int component_count; + struct glsl_src src[2]; + struct glsl_dst dst; + uint32_t dst_mask; + + dst_mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]); + glsl_src_init(&src[0], gen, &ins->src[0], src_mask); + glsl_src_init(&src[1], gen, &ins->src[1], src_mask); + + if ((component_count = vsir_write_mask_component_count(dst_mask)) > 1) + shader_glsl_print_assignment(gen, &dst, "vec%d(dot(%s, %s))", + component_count, src[0].str->buffer, src[1].str->buffer); + else + shader_glsl_print_assignment(gen, &dst, "dot(%s, %s)", + src[0].str->buffer, src[1].str->buffer); + + glsl_src_cleanup(&src[1], &gen->string_buffers); + glsl_src_cleanup(&src[0], &gen->string_buffers); + glsl_dst_cleanup(&dst, &gen->string_buffers); +} + static void shader_glsl_intrinsic(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op) { @@ -688,6 +712,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen, case VKD3DSIH_DIV: shader_glsl_binop(gen, ins, "/"); break; + case VKD3DSIH_DP3: + shader_glsl_dot(gen, ins, vkd3d_write_mask_from_component_count(3)); + break; case VKD3DSIH_FRC: shader_glsl_intrinsic(gen, ins, "fract"); break; diff --git a/tests/hlsl/determinant.shader_test b/tests/hlsl/determinant.shader_test index 4b6ce7d1..6adfd09d 100644 --- a/tests/hlsl/determinant.shader_test +++ b/tests/hlsl/determinant.shader_test @@ -64,7 +64,7 @@ float4 main() : sv_target uniform 0 float4 1.0 2.0 3.0 4.0 uniform 4 float4 5.0 -6.0 7.0 8.0 uniform 8 float4 9.0 10.0 11.0 12.0 -todo(glsl) draw quad +draw quad probe (0, 0) rgba (192.0, 192.0, 192.0, 192.0) [pixel shader] @@ -96,7 +96,7 @@ uniform 0 float4 1.0 2.0 3.0 0.0 uniform 4 float4 5.0 -6.0 7.0 0.0 uniform 8 float4 9.0 10.0 11.0 0.0 uniform 12 float4 0.0 0.0 0.0 0.0 -todo(glsl) draw quad +draw quad probe (0, 0) rgba (192.0, 192.0, 192.0, 192.0) [pixel shader fail]