vkd3d-shader/glsl: Implement VKD3DSIH_DP3.

This commit is contained in:
Henri Verbeet 2024-05-02 01:15:29 +02:00
parent 929010ffd7
commit 93cd63bc93
Notes: Henri Verbeet 2024-09-26 01:25:28 +02:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1113
2 changed files with 29 additions and 2 deletions

View File

@ -428,6 +428,30 @@ static void shader_glsl_binop(struct vkd3d_glsl_generator *gen,
glsl_dst_cleanup(&dst, &gen->string_buffers); 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, static void shader_glsl_intrinsic(struct vkd3d_glsl_generator *gen,
const struct vkd3d_shader_instruction *ins, const char *op) 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: case VKD3DSIH_DIV:
shader_glsl_binop(gen, ins, "/"); shader_glsl_binop(gen, ins, "/");
break; break;
case VKD3DSIH_DP3:
shader_glsl_dot(gen, ins, vkd3d_write_mask_from_component_count(3));
break;
case VKD3DSIH_FRC: case VKD3DSIH_FRC:
shader_glsl_intrinsic(gen, ins, "fract"); shader_glsl_intrinsic(gen, ins, "fract");
break; break;

View File

@ -64,7 +64,7 @@ float4 main() : sv_target
uniform 0 float4 1.0 2.0 3.0 4.0 uniform 0 float4 1.0 2.0 3.0 4.0
uniform 4 float4 5.0 -6.0 7.0 8.0 uniform 4 float4 5.0 -6.0 7.0 8.0
uniform 8 float4 9.0 10.0 11.0 12.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) probe (0, 0) rgba (192.0, 192.0, 192.0, 192.0)
[pixel shader] [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 4 float4 5.0 -6.0 7.0 0.0
uniform 8 float4 9.0 10.0 11.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 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) probe (0, 0) rgba (192.0, 192.0, 192.0, 192.0)
[pixel shader fail] [pixel shader fail]