summaryrefslogtreecommitdiff
path: root/tests/spec/arb_gpu_shader_int64/execution/fs-ishl-then-ushr.shader_test
blob: 30844ea0bf5792a9d06382b0932c5c1c6605c904 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
[require]
GL >= 4.0
GLSL >= 4.00
GL_ARB_gpu_shader_int64

[vertex shader passthrough]

[fragment shader]
#version 400
#extension GL_ARB_gpu_shader_int64 : require

uniform uint64_t ival[] = uint64_t[](0xBADDC0DEDEADBEEFul,
				     0xDEADBEA7BA5EBA11ul,
				     0xF0F1F2F3F4F5F6F7ul,
				     0x0F1F2F3F4F5F6F7Ful,
				     0x7071727374757677ul,
				     0x0717273747576777ul,
				     0x1F2E3D4C5B6A7988ul,
				     0xBADB100DDEADC0DEul);

const uint64_t expected[] = uint64_t[](0x00000000000000EFul,
				       0x00000000000000BAul,
				       0x00000000000000F5ul,
				       0x000000000000004Ful,
				       0x0000000000000073ul,
				       0x0000000000000027ul,
				       0x000000000000002Eul,
				       0x00000000000000BAul);

out vec4 piglit_fragcolor;

void main()
{
	uint fail_mask = 0;
	uint64_t result;
	uint i;

	/* This is INTENTIONALLY not a loop.  Putting it in a loop causes the
	 * optimization that generates the extract instructions to trigger
	 * before the shift count is known to be a constant.  The effectively
	 * prevents the bad code generation in the i965 driver from occuring.
	 */
	i = 0;
	result = (ival[i] << (56u - (i * 8u))) >> 56u;
	fail_mask |= result != expected[i] ? 1u << i : 0u;

	i = 1;
	result = (ival[i] << (56u - (i * 8u))) >> 56u;
	fail_mask |= result != expected[i] ? 1u << i : 0u;

	i = 2;
	result = (ival[i] << (56u - (i * 8u))) >> 56u;
	fail_mask |= result != expected[i] ? 1u << i : 0u;

	i = 3;
	result = (ival[i] << (56u - (i * 8u))) >> 56u;
	fail_mask |= result != expected[i] ? 1u << i : 0u;

	i = 4;
	result = (ival[i] << (56u - (i * 8u))) >> 56u;
	fail_mask |= result != expected[i] ? 1u << i : 0u;

	i = 5;
	result = (ival[i] << (56u - (i * 8u))) >> 56u;
	fail_mask |= result != expected[i] ? 1u << i : 0u;

	i = 6;
	result = (ival[i] << (56u - (i * 8u))) >> 56u;
	fail_mask |= result != expected[i] ? 1u << i : 0u;

	i = 7;
	result = (ival[i] << (56u - (i * 8u))) >> 56u;
	fail_mask |= result != expected[i] ? 1u << i : 0u;

	/* Construct a clever color so that just looking at the "Observed:"
	 * output from shader_runner will tell you exactly which values did
	 * not match.
	 */
	piglit_fragcolor = fail_mask == 0
		? vec4(0.0, 1.0, 0.0, 1.0)
		: vec4(float(fail_mask) / 255.0, 0.0, 0.0, 1.0);
}

[test]
clear color 0.5 0.5 0.5 0.5
clear

draw rect -1 -1 2 2
probe all rgba 0.0 1.0 0.0 1.0