mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
c2a7a40d3a
If a hlsl_ir_load loads a variable whose components are stored from different instructions, copy propagation doesn't replace it. But if all these instructions are constants (which currently is the case for value constructors), the load could be replaced with a constant value. Which is expected in some other instructions, e.g. texel_offsets when using aoffimmi modifiers. For instance, this shader: ``` sampler s; Texture2D t; float4 main() : sv_target { return t.Gather(s, float2(0.6, 0.6), int2(0, 0)); } ``` results in the following IR before applying the patch: ``` float | 6.00000024e-01 float | 6.00000024e-01 uint | 0 | = (<constructor-2>[@4].x @2) uint | 1 | = (<constructor-2>[@6].x @3) float2 | <constructor-2> int | 0 int | 0 uint | 0 | = (<constructor-5>[@11].x @9) uint | 1 | = (<constructor-5>[@13].x @10) int2 | <constructor-5> float4 | gather_red(resource = t, sampler = s, coords = @8, offset = @15) | return | = (<output-sv_target0> @16) ``` and this IR afterwards: ``` float2 | {6.00000024e-01 6.00000024e-01 } int2 | {0 0 } float4 | gather_red(resource = t, sampler = s, coords = @2, offset = @3) | return | = (<output-sv_target0> @4) ```
55 lines
828 B
Plaintext
55 lines
828 B
Plaintext
[require]
|
|
shader model >= 4.0
|
|
|
|
[sampler 0]
|
|
filter point point point
|
|
address clamp clamp clamp
|
|
|
|
[texture 0]
|
|
size (3, 3)
|
|
0.0 0.0 0.0 0.4 0.1 0.0 0.5 0.0 0.2 0.0 0.0 0.4
|
|
0.0 0.1 0.5 0.0 0.1 0.1 0.0 0.4 0.2 0.1 0.5 0.0
|
|
0.0 0.2 0.0 0.4 0.1 0.2 0.5 0.0 0.2 0.2 0.0 0.4
|
|
|
|
|
|
[pixel shader]
|
|
sampler s;
|
|
Texture2D t;
|
|
|
|
float4 main() : sv_target
|
|
{
|
|
return t.Sample(s, float2(0.5, 0.5), int2(0, 1));
|
|
}
|
|
|
|
[test]
|
|
draw quad
|
|
probe all rgba (0.1, 0.2, 0.5, 0.0)
|
|
|
|
|
|
[pixel shader]
|
|
sampler s;
|
|
Texture2D t;
|
|
|
|
float4 main() : sv_target
|
|
{
|
|
return t.Sample(s, float2(0.1, 0.5), int2(2, 1));
|
|
}
|
|
|
|
[test]
|
|
draw quad
|
|
probe all rgba (0.2, 0.2, 0.0, 0.4)
|
|
|
|
|
|
[pixel shader]
|
|
sampler s;
|
|
Texture2D t;
|
|
|
|
float4 main() : sv_target
|
|
{
|
|
return t.Sample(s, float2(0.9, 0.5), int2(-2, 1));
|
|
}
|
|
|
|
[test]
|
|
draw quad
|
|
probe all rgba (0.0, 0.2, 0.0, 0.4)
|