mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/glsl: Implement support for static texel offsets in shader_glsl_ld().
This commit is contained in:
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
@@ -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)
|
||||
{
|
||||
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 vkd3d_shader_descriptor_info1 *d;
|
||||
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;
|
||||
struct glsl_src coord;
|
||||
struct glsl_dst dst;
|
||||
uint32_t coord_mask;
|
||||
bool array, offset;
|
||||
|
||||
if (vkd3d_shader_instruction_has_texel_offset(ins))
|
||||
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
|
||||
"Internal compiler error: Unhandled texel fetch offset.");
|
||||
offset = vkd3d_shader_instruction_has_texel_offset(ins);
|
||||
|
||||
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,
|
||||
@@ -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)))
|
||||
{
|
||||
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
|
||||
{
|
||||
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
|
||||
"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_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);
|
||||
|
||||
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,
|
||||
resource_space, VKD3D_SHADER_DUMMY_SAMPLER_INDEX, 0);
|
||||
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
|
||||
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, ")");
|
||||
shader_glsl_print_swizzle(fetch, ins->src[1].swizzle, ins->dst[0].write_mask);
|
||||
|
||||
|
@@ -25,7 +25,7 @@ float4 main() : sv_target
|
||||
|
||||
[test]
|
||||
uniform 0 int 4
|
||||
todo(glsl | msl) draw quad
|
||||
todo(msl) draw quad
|
||||
probe (0, 0) rgba (110, 210, 410, 410)
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ float4 main() : sv_target
|
||||
|
||||
[test]
|
||||
uniform 0 int 3
|
||||
todo(glsl | msl) draw quad
|
||||
todo(msl) draw quad
|
||||
probe (0, 0) rgba (105, 5, 305, 305)
|
||||
|
||||
|
||||
@@ -59,5 +59,5 @@ float4 main() : sv_target
|
||||
|
||||
[test]
|
||||
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)
|
||||
|
@@ -18,7 +18,7 @@ float4 main(float4 pos : sv_position) : sv_target
|
||||
|
||||
|
||||
[test]
|
||||
todo(glsl | msl) draw quad
|
||||
todo(msl) draw quad
|
||||
probe (0, 0) rgba (0, 1, 0, 1)
|
||||
probe (1, 0) rgba (1, 1, 0, 1)
|
||||
probe (0, 1) rgba (0, 2, 0, 1)
|
||||
@@ -35,7 +35,7 @@ float4 main(float4 pos : sv_position) : sv_target
|
||||
|
||||
|
||||
[test]
|
||||
todo(glsl | msl) draw quad
|
||||
todo(msl) draw quad
|
||||
probe (3, 0) rgba (1, 0, 0, 1)
|
||||
probe (4, 0) rgba (2, 0, 0, 1)
|
||||
probe (3, 1) rgba (1, 1, 0, 1)
|
||||
|
Reference in New Issue
Block a user