diff --git a/Makefile.am b/Makefile.am index cbbf4d8d..2cb893d1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -200,6 +200,7 @@ vkd3d_shader_tests = \ tests/hlsl/object-parameters.shader_test \ tests/hlsl/object-references.shader_test \ tests/hlsl/patch-syntax.shader_test \ + tests/hlsl/pixel-position.shader_test \ tests/hlsl/point-sprite.shader_test \ tests/hlsl/pointer-cast.shader_test \ tests/hlsl/pow.shader_test \ diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c index 4b54de0a..a87ade5e 100644 --- a/libs/vkd3d-shader/glsl.c +++ b/libs/vkd3d-shader/glsl.c @@ -1296,7 +1296,7 @@ static void shader_glsl_print_sysval_name(struct vkd3d_string_buffer *buffer, st vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL, "Internal compiler error: Unhandled SV_POSITION index %u.", idx); if (version->type == VKD3D_SHADER_TYPE_PIXEL) - vkd3d_string_buffer_printf(buffer, "gl_FragCoord"); + vkd3d_string_buffer_printf(buffer, "vec4(gl_FragCoord.xyz, 1.0 / gl_FragCoord.w)"); else vkd3d_string_buffer_printf(buffer, "gl_Position"); break; diff --git a/tests/hlsl/pixel-position.shader_test b/tests/hlsl/pixel-position.shader_test new file mode 100644 index 00000000..eb2e1d34 --- /dev/null +++ b/tests/hlsl/pixel-position.shader_test @@ -0,0 +1,32 @@ +[vb 0] +-1.0 -1.0 0.1 1.2 +-1.0 1.0 0.1 2.0 + 1.0 -1.0 0.7 1.2 + 1.0 1.0 0.7 2.0 + +[input layout] +0 r32g32b32a32-float POSITION + +[vertex shader] +float4 main(float4 pos : POSITION) : sv_position +{ + return pos; +} + +[pixel shader fail(sm<4) todo(sm<4)] +float4 main(float4 pos : sv_position) : sv_target +{ + return pos; +} + +[test] +clear rtv 0 0.0 0.0 0.0 0.0 +todo(msl) draw triangle strip 4 +probe ( 80, 140) rgba( 0.0, 0.0, 0.0, 0.0) +probe ( 80, 420) rgba( 80.5, 420.5, 0.100678146, 1.229981) 192 +probe (180, 140) rgba(180.5, 140.5, 0.077760354, 1.918082) 192 +probe (180, 420) rgba(180.5, 420.5, 0.194427669, 1.229981) 192 +probe (460, 140) rgba(460.5, 140.5, 0.340260297, 1.918082) 192 +probe (460, 420) rgba(460.5, 420.5, 0.456926346, 1.229981) 192 +probe (560, 140) rgba( 0.0, 0.0, 0.0, 0.0) +probe (560, 420) rgba(560.5, 420.5, 0.550675929, 1.229981) 192