1 /*
2  * Copyright © 2013 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23 
24 #ifndef BRW_MULTISAMPLE_STATE_H
25 #define BRW_MULTISAMPLE_STATE_H
26 
27 #include <stdint.h>
28 
29 /**
30  * Note: There are no standard multisample positions defined in OpenGL
31  * specifications. Implementations have the freedom to pick the positions
32  * which give plausible results. But the Vulkan specification does define
33  * standard sample positions. So, we decided to pick the same pattern in
34  * OpenGL as in Vulkan to keep it uniform across drivers and also to avoid
35  * breaking applications which rely on this standard pattern.
36  */
37 
38 /**
39  * 1x MSAA has a single sample at the center: (0.5, 0.5) -> (0x8, 0x8).
40  *
41  * 2x MSAA sample positions are (0.75, 0.75) and (0.25, 0.25):
42  *   4 c
43  * 4 1
44  * c   0
45  */
46 static const uint32_t
47 brw_multisample_positions_1x_2x = 0x008844cc;
48 
49 /**
50  * Sample positions:
51  *   2 6 a e
52  * 2   0
53  * 6       1
54  * a 2
55  * e     3
56  */
57 static const uint32_t
58 brw_multisample_positions_4x = 0xae2ae662;
59 
60 /**
61  * Sample positions:
62  *
63  * From the Ivy Bridge PRM, Vol2 Part1 p304 (3DSTATE_MULTISAMPLE:
64  * Programming Notes):
65  *     "When programming the sample offsets (for NUMSAMPLES_4 or _8 and
66  *     MSRASTMODE_xxx_PATTERN), the order of the samples 0 to 3 (or 7
67  *     for 8X) must have monotonically increasing distance from the
68  *     pixel center. This is required to get the correct centroid
69  *     computation in the device."
70  *
71  * Sample positions:
72  *   1 3 5 7 9 b d f
73  * 1               7
74  * 3     3
75  * 5         0
76  * 7 5
77  * 9             2
78  * b       1
79  * d   4
80  * f           6
81  */
82 static const uint32_t
83 brw_multisample_positions_8x[] = { 0x53d97b95, 0xf1bf173d };
84 
85 /**
86  * Sample positions:
87  *
88  *    0 1 2 3 4 5 6 7 8 9 a b c d e f
89  * 0   15
90  * 1                  9
91  * 2         10
92  * 3                        7
93  * 4                               13
94  * 5                1
95  * 6        4
96  * 7                          3
97  * 8 12
98  * 9                    0
99  * a            2
100  * b                            6
101  * c     11
102  * d                      5
103  * e              8
104  * f                             14
105  */
106 static const uint32_t
107 brw_multisample_positions_16x[] = {
108    0xc75a7599, 0xb3dbad36, 0x2c42816e, 0x10eff408
109 };
110 
111 #endif /* BRW_MULTISAMPLE_STATE_H */
112