1 /*
2 * Copyright 2023 Alyssa Rosenzweig
3 * SPDX-License-Identifier: MIT
4 */
5
6 #include "u_sample_positions.h"
7
8 /*
9 * This file implement a default version of get_sample_position that returns the
10 * standard sample positions, as standardized in both Vulkan and Direct3D and
11 * hence almost everyone's hardware.
12 */
13
14 static const float u_default_sample_positions_1x[][2] = {
15 {0.5, 0.5}
16 };
17
18 static const float u_default_sample_positions_2x[][2] = {
19 {0.75, 0.75},
20 {0.25, 0.25}
21 };
22
23 static const float u_default_sample_positions_4x[][4] = {
24 {0.375, 0.125},
25 {0.875, 0.375},
26 {0.125, 0.625},
27 {0.625, 0.875},
28 };
29
30 static const float u_default_sample_positions_8x[][4] = {
31 {0.5625, 0.3125},
32 {0.4375, 0.6875},
33 {0.8125, 0.5625},
34 {0.3125, 0.1875},
35 {0.1875, 0.8125},
36 {0.0625, 0.4375},
37 {0.6875, 0.9375},
38 {0.9375, 0.0625},
39
40 };
41
42 static const float u_default_sample_positions_16x[][4] = {
43 {0.5625, 0.5625},
44 {0.4375, 0.3125},
45 {0.3125, 0.625},
46 {0.75, 0.4375},
47 {0.1875, 0.375},
48 {0.625, 0.8125},
49 {0.8125, 0.6875},
50 {0.6875, 0.1875},
51 {0.375, 0.875},
52 {0.5, 0.0625},
53 {0.25, 0.125},
54 {0.125, 0.75},
55 {0.0, 0.5},
56 {0.9375, 0.25},
57 {0.875, 0.9375},
58 {0.0625, 0.0},
59 };
60
61 static const float *
u_default_sample_position(unsigned sample_count,unsigned sample_index)62 u_default_sample_position(unsigned sample_count, unsigned sample_index)
63 {
64 switch (sample_count) {
65 case 0:
66 case 1: return u_default_sample_positions_1x[sample_index];
67 case 2: return u_default_sample_positions_2x[sample_index];
68 case 4: return u_default_sample_positions_4x[sample_index];
69 case 8: return u_default_sample_positions_8x[sample_index];
70 case 16: return u_default_sample_positions_16x[sample_index];
71 default: unreachable("Invalid sample count");
72 }
73 }
74
75 void
u_default_get_sample_position(struct pipe_context * ctx,unsigned sample_count,unsigned sample_index,float * out_value)76 u_default_get_sample_position(struct pipe_context *ctx,
77 unsigned sample_count,
78 unsigned sample_index,
79 float *out_value)
80 {
81 const float *positions =
82 u_default_sample_position(sample_count, sample_index);
83
84 out_value[0] = positions[0];
85 out_value[1] = positions[1];
86 }
87