xref: /aosp_15_r20/external/mesa3d/src/gallium/auxiliary/util/u_sample_positions.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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