vkd3d-shader/glsl: Implement support for static texel offsets in shader_glsl_ld().

This commit is contained in:
Henri Verbeet
2024-10-25 15:17:01 +02:00
parent a1edfc4008
commit 4c91f4aa9e
Notes: Henri Verbeet 2025-08-28 20:32:38 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1696
3 changed files with 19 additions and 14 deletions

View File

@@ -792,7 +792,7 @@ static void shader_glsl_print_texel_offset(struct vkd3d_string_buffer *buffer, s
static void shader_glsl_ld(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins) static void shader_glsl_ld(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
{ {
unsigned int resource_id, resource_idx, resource_space, sample_count; unsigned int coord_size, resource_id, resource_idx, resource_space, sample_count;
const struct glsl_resource_type_info *resource_type_info; const struct glsl_resource_type_info *resource_type_info;
const struct vkd3d_shader_descriptor_info1 *d; const struct vkd3d_shader_descriptor_info1 *d;
enum vkd3d_shader_resource_type resource_type; enum vkd3d_shader_resource_type resource_type;
@@ -800,11 +800,9 @@ static void shader_glsl_ld(struct vkd3d_glsl_generator *gen, const struct vkd3d_
enum vsir_data_type data_type; enum vsir_data_type data_type;
struct glsl_src coord; struct glsl_src coord;
struct glsl_dst dst; struct glsl_dst dst;
uint32_t coord_mask; bool array, offset;
if (vkd3d_shader_instruction_has_texel_offset(ins)) offset = vkd3d_shader_instruction_has_texel_offset(ins);
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
"Internal compiler error: Unhandled texel fetch offset.");
if (ins->src[1].reg.idx[0].rel_addr || ins->src[1].reg.idx[1].rel_addr) if (ins->src[1].reg.idx[0].rel_addr || ins->src[1].reg.idx[1].rel_addr)
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED, vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
@@ -831,20 +829,22 @@ static void shader_glsl_ld(struct vkd3d_glsl_generator *gen, const struct vkd3d_
if ((resource_type_info = shader_glsl_get_resource_type_info(resource_type))) if ((resource_type_info = shader_glsl_get_resource_type_info(resource_type)))
{ {
coord_mask = vkd3d_write_mask_from_component_count(resource_type_info->coord_size); coord_size = resource_type_info->coord_size;
array = resource_type_info->array;
} }
else else
{ {
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL, vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
"Internal compiler error: Unhandled resource type %#x.", resource_type); "Internal compiler error: Unhandled resource type %#x.", resource_type);
coord_mask = vkd3d_write_mask_from_component_count(2); coord_size = 2;
array = false;
} }
glsl_dst_init(&dst, gen, ins, &ins->dst[0]); glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
glsl_src_init(&coord, gen, &ins->src[0], coord_mask); glsl_src_init(&coord, gen, &ins->src[0], vkd3d_write_mask_from_component_count(coord_size));
fetch = vkd3d_string_buffer_get(&gen->string_buffers); fetch = vkd3d_string_buffer_get(&gen->string_buffers);
vkd3d_string_buffer_printf(fetch, "texelFetch("); vkd3d_string_buffer_printf(fetch, "texelFetch%s(", offset ? "Offset" : "");
shader_glsl_print_combined_sampler_name(fetch, gen, resource_idx, shader_glsl_print_combined_sampler_name(fetch, gen, resource_idx,
resource_space, VKD3D_SHADER_DUMMY_SAMPLER_INDEX, 0); resource_space, VKD3D_SHADER_DUMMY_SAMPLER_INDEX, 0);
vkd3d_string_buffer_printf(fetch, ", %s", coord.str->buffer); vkd3d_string_buffer_printf(fetch, ", %s", coord.str->buffer);
@@ -860,6 +860,11 @@ static void shader_glsl_ld(struct vkd3d_glsl_generator *gen, const struct vkd3d_
else else
shader_glsl_print_src(fetch, gen, &ins->src[2], VKD3DSP_WRITEMASK_0, ins->src[2].reg.data_type); shader_glsl_print_src(fetch, gen, &ins->src[2], VKD3DSP_WRITEMASK_0, ins->src[2].reg.data_type);
} }
if (offset)
{
vkd3d_string_buffer_printf(fetch, ", ");
shader_glsl_print_texel_offset(fetch, gen, coord_size - array, &ins->texel_offset);
}
vkd3d_string_buffer_printf(fetch, ")"); vkd3d_string_buffer_printf(fetch, ")");
shader_glsl_print_swizzle(fetch, ins->src[1].swizzle, ins->dst[0].write_mask); shader_glsl_print_swizzle(fetch, ins->src[1].swizzle, ins->dst[0].write_mask);

View File

@@ -25,7 +25,7 @@ float4 main() : sv_target
[test] [test]
uniform 0 int 4 uniform 0 int 4
todo(glsl | msl) draw quad todo(msl) draw quad
probe (0, 0) rgba (110, 210, 410, 410) probe (0, 0) rgba (110, 210, 410, 410)
@@ -43,7 +43,7 @@ float4 main() : sv_target
[test] [test]
uniform 0 int 3 uniform 0 int 3
todo(glsl | msl) draw quad todo(msl) draw quad
probe (0, 0) rgba (105, 5, 305, 305) probe (0, 0) rgba (105, 5, 305, 305)
@@ -59,5 +59,5 @@ float4 main() : sv_target
[test] [test]
uniform 0 int 1 uniform 0 int 1
todo(glsl | msl) draw quad todo(msl) draw quad
probe (0, 0) rgba (14.0, 14.0, 14.0, 14.0) probe (0, 0) rgba (14.0, 14.0, 14.0, 14.0)

View File

@@ -18,7 +18,7 @@ float4 main(float4 pos : sv_position) : sv_target
[test] [test]
todo(glsl | msl) draw quad todo(msl) draw quad
probe (0, 0) rgba (0, 1, 0, 1) probe (0, 0) rgba (0, 1, 0, 1)
probe (1, 0) rgba (1, 1, 0, 1) probe (1, 0) rgba (1, 1, 0, 1)
probe (0, 1) rgba (0, 2, 0, 1) probe (0, 1) rgba (0, 2, 0, 1)
@@ -35,7 +35,7 @@ float4 main(float4 pos : sv_position) : sv_target
[test] [test]
todo(glsl | msl) draw quad todo(msl) draw quad
probe (3, 0) rgba (1, 0, 0, 1) probe (3, 0) rgba (1, 0, 0, 1)
probe (4, 0) rgba (2, 0, 0, 1) probe (4, 0) rgba (2, 0, 0, 1)
probe (3, 1) rgba (1, 1, 0, 1) probe (3, 1) rgba (1, 1, 0, 1)