vkd3d-shader/msl: Implement support for VKD3DSPSM_ABS modifiers.

This commit is contained in:
Feifan He 2024-11-22 15:45:54 +08:00 committed by Henri Verbeet
parent 5bb7dcaba3
commit 4add058cd8
Notes: Henri Verbeet 2024-11-24 00:11:21 +01:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1274
2 changed files with 30 additions and 7 deletions

View File

@ -246,19 +246,40 @@ static void msl_src_init(struct msl_src *msl_src, struct msl_generator *gen,
const struct vkd3d_shader_src_param *vsir_src, uint32_t mask)
{
const struct vkd3d_shader_register *reg = &vsir_src->reg;
struct vkd3d_string_buffer *str;
msl_src->str = vkd3d_string_buffer_get(&gen->string_buffers);
if (reg->non_uniform)
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
"Internal compiler error: Unhandled 'non-uniform' modifier.");
if (vsir_src->modifiers)
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
"Internal compiler error: Unhandled source modifier(s) %#x.", vsir_src->modifiers);
msl_print_register_name(msl_src->str, gen, reg);
if (!vsir_src->modifiers)
str = msl_src->str;
else
str = vkd3d_string_buffer_get(&gen->string_buffers);
msl_print_register_name(str, gen, reg);
if (reg->dimension == VSIR_DIMENSION_VEC4)
msl_print_swizzle(msl_src->str, vsir_src->swizzle, mask);
msl_print_swizzle(str, vsir_src->swizzle, mask);
switch (vsir_src->modifiers)
{
case VKD3DSPSM_NONE:
break;
case VKD3DSPSM_ABS:
vkd3d_string_buffer_printf(msl_src->str, "abs(%s)", str->buffer);
break;
default:
vkd3d_string_buffer_printf(msl_src->str, "<unhandled modifier %#x>(%s)",
vsir_src->modifiers, str->buffer);
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
"Internal compiler error: Unhandled source modifier(s) %#x.", vsir_src->modifiers);
break;
}
if (str != msl_src->str)
vkd3d_string_buffer_release(&gen->string_buffers, str);
}
static void msl_dst_cleanup(struct msl_dst *dst, struct vkd3d_string_buffer_cache *cache)
@ -841,6 +862,8 @@ static int msl_generator_generate(struct msl_generator *gen, struct vkd3d_shader
MESSAGE("Generating a MSL shader. This is unsupported; you get to keep all the pieces if it breaks.\n");
vkd3d_string_buffer_printf(gen->buffer, "/* Generated by %s. */\n\n", vkd3d_shader_get_version(NULL, NULL));
vkd3d_string_buffer_printf(gen->buffer, "#include <metal_common>\n\n");
vkd3d_string_buffer_printf(gen->buffer, "using namespace metal;\n\n");
if (gen->program->global_flags)
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,

View File

@ -8,8 +8,8 @@ float4 main() : sv_target
[test]
uniform 0 float4 0.1 0.7 0.0 0.0
todo(msl) draw quad
draw quad
probe (0, 0) rgba (0.1, 0.7, 0.4, 0.4)
uniform 0 float4 -0.7 0.1 0.0 0.0
todo(msl) draw quad
draw quad
probe (0, 0) rgba (0.7, 0.1, 1.2, 0.4)