mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/glsl: Implement support for VKD3DSPR_SAMPLEMASK registers.
This commit is contained in:
Notes:
Henri Verbeet
2025-09-01 15:21:55 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1705
@@ -288,6 +288,14 @@ static void shader_glsl_print_register_name(struct vkd3d_string_buffer *buffer,
|
|||||||
shader_glsl_print_subscript(buffer, gen, reg->idx[1].rel_addr, reg->idx[1].offset);
|
shader_glsl_print_subscript(buffer, gen, reg->idx[1].rel_addr, reg->idx[1].offset);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VKD3DSPR_SAMPLEMASK:
|
||||||
|
if (gen->program->shader_version.type != VKD3D_SHADER_TYPE_PIXEL)
|
||||||
|
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
|
||||||
|
"Internal compiler error: Unhandled sample coverage mask in shader type #%x.",
|
||||||
|
gen->program->shader_version.type);
|
||||||
|
vkd3d_string_buffer_printf(buffer, "o_mask");
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
|
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
|
||||||
"Internal compiler error: Unhandled register type %#x.", reg->type);
|
"Internal compiler error: Unhandled register type %#x.", reg->type);
|
||||||
@@ -1441,6 +1449,12 @@ static void shader_glsl_shader_epilogue(struct vkd3d_glsl_generator *gen)
|
|||||||
shader_glsl_print_write_mask(buffer, e->mask);
|
shader_glsl_print_write_mask(buffer, e->mask);
|
||||||
vkd3d_string_buffer_printf(buffer, ";\n");
|
vkd3d_string_buffer_printf(buffer, ";\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_SAMPLEMASK))
|
||||||
|
{
|
||||||
|
shader_glsl_print_indent(buffer, gen->indent);
|
||||||
|
vkd3d_string_buffer_printf(gen->buffer, "gl_SampleMask[0] = floatBitsToInt(o_mask);\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shader_glsl_ret(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
|
static void shader_glsl_ret(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
|
||||||
@@ -2349,6 +2363,8 @@ static void shader_glsl_generate_declarations(struct vkd3d_glsl_generator *gen)
|
|||||||
vkd3d_string_buffer_printf(buffer, "vec4 %s_in[%u];\n", gen->prefix, gen->limits.input_count);
|
vkd3d_string_buffer_printf(buffer, "vec4 %s_in[%u];\n", gen->prefix, gen->limits.input_count);
|
||||||
if (gen->limits.output_count)
|
if (gen->limits.output_count)
|
||||||
vkd3d_string_buffer_printf(buffer, "vec4 %s_out[%u];\n", gen->prefix, gen->limits.output_count);
|
vkd3d_string_buffer_printf(buffer, "vec4 %s_out[%u];\n", gen->prefix, gen->limits.output_count);
|
||||||
|
if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_SAMPLEMASK))
|
||||||
|
vkd3d_string_buffer_printf(gen->buffer, "float o_mask;\n");
|
||||||
if (program->temp_count)
|
if (program->temp_count)
|
||||||
vkd3d_string_buffer_printf(buffer, "vec4 r[%u];\n", program->temp_count);
|
vkd3d_string_buffer_printf(buffer, "vec4 r[%u];\n", program->temp_count);
|
||||||
vkd3d_string_buffer_printf(buffer, "\n");
|
vkd3d_string_buffer_printf(buffer, "\n");
|
||||||
|
@@ -14,11 +14,11 @@ float4 main(out uint sample_mask : SV_Coverage) : SV_Target
|
|||||||
|
|
||||||
[test]
|
[test]
|
||||||
clear rtv 0 0.0 0.0 0.0 0.0
|
clear rtv 0 0.0 0.0 0.0 0.0
|
||||||
todo(glsl) draw quad
|
draw quad
|
||||||
probe (0, 0) rgba (0.5, 0.5, 0.5, 0.5)
|
probe (0, 0) rgba (0.5, 0.5, 0.5, 0.5)
|
||||||
sample mask 0x0b
|
sample mask 0x0b
|
||||||
clear rtv 0 0.0 0.0 0.0 0.0
|
clear rtv 0 0.0 0.0 0.0 0.0
|
||||||
todo(glsl) draw quad
|
draw quad
|
||||||
probe (0, 0) rgba (0.25, 0.25, 0.25, 0.25)
|
probe (0, 0) rgba (0.25, 0.25, 0.25, 0.25)
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user