vkd3d-shader/glsl: Implement support for VKD3DSPR_IMMCONST registers.

This commit is contained in:
Atharva Nimbalkar 2021-08-25 08:26:51 +05:30 committed by Henri Verbeet
parent ab07637ee1
commit 1d485cc8a9
Notes: Henri Verbeet 2024-09-19 14:46:44 +02:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1084
9 changed files with 69 additions and 17 deletions

View File

@ -137,6 +137,21 @@ static void shader_glsl_print_register_name(struct vkd3d_string_buffer *buffer,
vkd3d_string_buffer_printf(buffer, "%s_out[%u]", gen->prefix, reg->idx[0].offset);
break;
case VKD3DSPR_IMMCONST:
switch (reg->dimension)
{
case VSIR_DIMENSION_SCALAR:
vkd3d_string_buffer_printf(buffer, "%#xu", reg->u.immconst_u32[0]);
break;
default:
vkd3d_string_buffer_printf(buffer, "<unhandled_dimension %#x>", reg->dimension);
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
"Internal compiler error: Unhandled dimension %#x.", reg->dimension);
break;
}
break;
case VKD3DSPR_CONSTBUFFER:
if (reg->idx_count != 3)
{
@ -195,12 +210,41 @@ static void glsl_src_cleanup(struct glsl_src *src, struct vkd3d_string_buffer_ca
vkd3d_string_buffer_release(cache, src->str);
}
static void shader_glsl_print_bitcast(struct vkd3d_string_buffer *dst, struct vkd3d_glsl_generator *gen,
const char *src, enum vkd3d_data_type dst_data_type, enum vkd3d_data_type src_data_type)
{
if (dst_data_type == VKD3D_DATA_UNORM || dst_data_type == VKD3D_DATA_SNORM)
dst_data_type = VKD3D_DATA_FLOAT;
if (src_data_type == VKD3D_DATA_UNORM || src_data_type == VKD3D_DATA_SNORM)
src_data_type = VKD3D_DATA_FLOAT;
if (dst_data_type == src_data_type)
{
vkd3d_string_buffer_printf(dst, "%s", src);
return;
}
if (src_data_type == VKD3D_DATA_UINT && dst_data_type == VKD3D_DATA_FLOAT)
{
vkd3d_string_buffer_printf(dst, "uintBitsToFloat(%s)", src);
return;
}
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
"Internal compiler error: Unhandled bitcast from %#x to %#x.",
src_data_type, dst_data_type);
vkd3d_string_buffer_printf(dst, "%s", src);
}
static void glsl_src_init(struct glsl_src *glsl_src, struct vkd3d_glsl_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 *register_name;
enum vkd3d_data_type src_data_type;
glsl_src->str = vkd3d_string_buffer_get(&gen->string_buffers);
register_name = vkd3d_string_buffer_get(&gen->string_buffers);
if (reg->non_uniform)
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
@ -209,9 +253,17 @@ static void glsl_src_init(struct glsl_src *glsl_src, struct vkd3d_glsl_generator
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
"Internal compiler error: Unhandled source modifier(s) %#x.", vsir_src->modifiers);
shader_glsl_print_register_name(glsl_src->str, gen, reg);
if (reg->type == VKD3DSPR_IMMCONST)
src_data_type = VKD3D_DATA_UINT;
else
src_data_type = VKD3D_DATA_FLOAT;
shader_glsl_print_register_name(register_name, gen, reg);
shader_glsl_print_bitcast(glsl_src->str, gen, register_name->buffer, reg->data_type, src_data_type);
if (reg->dimension == VSIR_DIMENSION_VEC4)
shader_glsl_print_swizzle(glsl_src->str, vsir_src->swizzle, mask);
vkd3d_string_buffer_release(&gen->string_buffers, register_name);
}
static void glsl_dst_cleanup(struct glsl_dst *dst, struct vkd3d_string_buffer_cache *cache)

View File

@ -36,7 +36,7 @@ float4 main() : sv_target
uniform 0 float4 11 12 0 0
uniform 4 float4 13 14 0 0
uniform 8 float4 20 21 22 23
todo(glsl) draw quad
draw quad
probe (320,240) rgba (13.0, 21.0, 0.0, 0.0)
[pixel shader fail]

View File

@ -70,7 +70,7 @@ float4 main() : sv_target
[test]
uniform 0 float 4.0
todo(glsl) draw quad
draw quad
probe (0, 0) rgba (409.1, 409.1, 409.1, 409.1)
[pixel shader]
@ -100,7 +100,7 @@ float4 main() : sv_target
[test]
uniform 0 float 4.0
todo(glsl) draw quad
draw quad
probe (0, 0) rgba (410.1, 410.1, 410.1, 410.1)
% loop attribute by itself

View File

@ -44,7 +44,7 @@ row_major float4x1 main() : sv_target
}
[test]
todo(sm>=6 | glsl) draw quad
todo(sm>=6) draw quad
probe rtv 0 (0,0) r (1.0)
probe rtv 1 (0,0) r (2.0)
probe rtv 2 (0,0) r (3.0)
@ -57,7 +57,7 @@ float1x4 main() : sv_target
}
[test]
todo(sm>=6 | glsl) draw quad
todo(sm>=6) draw quad
probe rtv 0 (0,0) r (1.0)
probe rtv 1 (0,0) r (2.0)
probe rtv 2 (0,0) r (3.0)
@ -78,7 +78,7 @@ void main(out float1x2 x : sv_target0, out float1x2 y : sv_target2)
}
[test]
todo(sm>=6 | glsl) draw quad
todo(sm>=6) draw quad
probe rtv 0 (0,0) r (1.0)
probe rtv 1 (0,0) r (2.0)
probe rtv 2 (0,0) r (5.0)

View File

@ -19,7 +19,7 @@ float4 main() : sv_target
[test]
uniform 0 float4 1.0 2.0 3.0 4.0
uniform 4 float4 5.0 6.0 7.0 8.0
todo(glsl) draw quad
draw quad
probe (0, 0) rgba (1.0, 2.0, 3.0, 0.0)
@ -45,7 +45,7 @@ float4 main() : sv_target
[test]
uniform 0 float4 1.0 2.0 3.0 4.0
uniform 4 float4 5.0 6.0 7.0 8.0
todo(glsl) draw quad
draw quad
probe (0, 0) rgba (1.0, 2.0, 5.0, 0.0)
@ -66,5 +66,5 @@ float4 main() : sv_target
[test]
uniform 0 float4 1.0 2.0 3.0 4.0
uniform 4 float4 5.0 6.0 7.0 8.0
todo(glsl) draw quad
draw quad
probe (0, 0) rgba (1.0, 2.0, 5.0, 0.0)

View File

@ -117,7 +117,7 @@ uniform 0 float4 0.1 0.2 0.3 0.4
uniform 4 float4 1.1 1.2 1.3 1.4
uniform 8 float4 2.1 2.2 2.3 2.4
uniform 12 float4 3.1 3.2 3.3 3.4
todo(glsl) draw quad
draw quad
probe (0, 0) rgba (2.1, 2.2, 0.0, 0.0)
@ -188,7 +188,7 @@ uniform 0 float4 0.1 0.2 0.3 0.4
uniform 4 float4 1.1 1.2 1.3 1.4
uniform 8 float4 2.1 2.2 2.3 2.4
uniform 12 float4 3.1 3.2 3.3 3.4
todo(glsl) draw quad
draw quad
probe (0, 0) rgba (2.1, 2.2, 2.3, 0.0)

View File

@ -17,7 +17,7 @@ void main(in uniform float4 a, uniform float4 b, out float4 o : sv_target)
[test]
uniform 0 float4 0.1 0.0 0.0 0.0
uniform 4 float4 0.2 0.0 0.0 0.0
todo(sm>=6 | glsl) draw quad
todo(sm>=6) draw quad
probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4)
[pixel shader]
@ -42,5 +42,5 @@ void main(out float4 o : sv_target)
[test]
uniform 0 float4 0.1 0.0 0.0 0.0
uniform 4 float4 0.2 0.0 0.0 0.0
todo(glsl) draw quad
draw quad
probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4)

View File

@ -169,7 +169,7 @@ float4 main() : sv_target
[test]
uniform 0 float4 20 30 40 -1
todo(glsl) draw quad
draw quad
probe (0,0) rgba (10.0, 20.0, 30.0, 40.0)
@ -187,7 +187,7 @@ float4 main() : sv_target
[test]
uniform 0 float4 20 30 80 -1
todo(glsl) draw quad
draw quad
probe (0,0) rgba (80.0, 30.0, 20.0, 10.0)

View File

@ -31,5 +31,5 @@ float4 main(uniform float2x2 m, uniform float4 v) : sv_target
uniform 0 float4 11 12 0 0
uniform 4 float4 13 14 0 0
uniform 8 float4 20 21 22 23
todo(glsl) draw quad
draw quad
probe (320,240) rgba (13.0, 21.0, 0.0, 0.0)