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); vkd3d_string_buffer_printf(buffer, "%s_out[%u]", gen->prefix, reg->idx[0].offset);
break; 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: case VKD3DSPR_CONSTBUFFER:
if (reg->idx_count != 3) 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); 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, 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_src_param *vsir_src, uint32_t mask)
{ {
const struct vkd3d_shader_register *reg = &vsir_src->reg; 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); glsl_src->str = vkd3d_string_buffer_get(&gen->string_buffers);
register_name = vkd3d_string_buffer_get(&gen->string_buffers);
if (reg->non_uniform) if (reg->non_uniform)
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL, 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, vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
"Internal compiler error: Unhandled source modifier(s) %#x.", vsir_src->modifiers); "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) if (reg->dimension == VSIR_DIMENSION_VEC4)
shader_glsl_print_swizzle(glsl_src->str, vsir_src->swizzle, mask); 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) 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 0 float4 11 12 0 0
uniform 4 float4 13 14 0 0 uniform 4 float4 13 14 0 0
uniform 8 float4 20 21 22 23 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) probe (320,240) rgba (13.0, 21.0, 0.0, 0.0)
[pixel shader fail] [pixel shader fail]

View File

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

View File

@ -44,7 +44,7 @@ row_major float4x1 main() : sv_target
} }
[test] [test]
todo(sm>=6 | glsl) draw quad todo(sm>=6) draw quad
probe rtv 0 (0,0) r (1.0) probe rtv 0 (0,0) r (1.0)
probe rtv 1 (0,0) r (2.0) probe rtv 1 (0,0) r (2.0)
probe rtv 2 (0,0) r (3.0) probe rtv 2 (0,0) r (3.0)
@ -57,7 +57,7 @@ float1x4 main() : sv_target
} }
[test] [test]
todo(sm>=6 | glsl) draw quad todo(sm>=6) draw quad
probe rtv 0 (0,0) r (1.0) probe rtv 0 (0,0) r (1.0)
probe rtv 1 (0,0) r (2.0) probe rtv 1 (0,0) r (2.0)
probe rtv 2 (0,0) r (3.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] [test]
todo(sm>=6 | glsl) draw quad todo(sm>=6) draw quad
probe rtv 0 (0,0) r (1.0) probe rtv 0 (0,0) r (1.0)
probe rtv 1 (0,0) r (2.0) probe rtv 1 (0,0) r (2.0)
probe rtv 2 (0,0) r (5.0) probe rtv 2 (0,0) r (5.0)

View File

@ -19,7 +19,7 @@ float4 main() : sv_target
[test] [test]
uniform 0 float4 1.0 2.0 3.0 4.0 uniform 0 float4 1.0 2.0 3.0 4.0
uniform 4 float4 5.0 6.0 7.0 8.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) probe (0, 0) rgba (1.0, 2.0, 3.0, 0.0)
@ -45,7 +45,7 @@ float4 main() : sv_target
[test] [test]
uniform 0 float4 1.0 2.0 3.0 4.0 uniform 0 float4 1.0 2.0 3.0 4.0
uniform 4 float4 5.0 6.0 7.0 8.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) probe (0, 0) rgba (1.0, 2.0, 5.0, 0.0)
@ -66,5 +66,5 @@ float4 main() : sv_target
[test] [test]
uniform 0 float4 1.0 2.0 3.0 4.0 uniform 0 float4 1.0 2.0 3.0 4.0
uniform 4 float4 5.0 6.0 7.0 8.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) 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 4 float4 1.1 1.2 1.3 1.4
uniform 8 float4 2.1 2.2 2.3 2.4 uniform 8 float4 2.1 2.2 2.3 2.4
uniform 12 float4 3.1 3.2 3.3 3.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) 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 4 float4 1.1 1.2 1.3 1.4
uniform 8 float4 2.1 2.2 2.3 2.4 uniform 8 float4 2.1 2.2 2.3 2.4
uniform 12 float4 3.1 3.2 3.3 3.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) 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] [test]
uniform 0 float4 0.1 0.0 0.0 0.0 uniform 0 float4 0.1 0.0 0.0 0.0
uniform 4 float4 0.2 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) probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4)
[pixel shader] [pixel shader]
@ -42,5 +42,5 @@ void main(out float4 o : sv_target)
[test] [test]
uniform 0 float4 0.1 0.0 0.0 0.0 uniform 0 float4 0.1 0.0 0.0 0.0
uniform 4 float4 0.2 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) probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4)

View File

@ -169,7 +169,7 @@ float4 main() : sv_target
[test] [test]
uniform 0 float4 20 30 40 -1 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) probe (0,0) rgba (10.0, 20.0, 30.0, 40.0)
@ -187,7 +187,7 @@ float4 main() : sv_target
[test] [test]
uniform 0 float4 20 30 80 -1 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) 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 0 float4 11 12 0 0
uniform 4 float4 13 14 0 0 uniform 4 float4 13 14 0 0
uniform 8 float4 20 21 22 23 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) probe (320,240) rgba (13.0, 21.0, 0.0, 0.0)