i965: Update multisampling state for Broadwell.
[mesa.git] / src / mesa / drivers / dri / i965 / gen8_multisample_state.c
1 /*
2 * Copyright © 2012 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 #include "intel_batchbuffer.h"
25
26 #include "brw_context.h"
27 #include "brw_defines.h"
28 #include "brw_multisample_state.h"
29
30 /**
31 * 3DSTATE_MULTISAMPLE
32 */
33 void
34 gen8_emit_3dstate_multisample(struct brw_context *brw, unsigned num_samples)
35 {
36 uint32_t number_of_multisamples = 0;
37
38 switch (num_samples) {
39 case 0:
40 case 1:
41 number_of_multisamples = MS_NUMSAMPLES_1;
42 break;
43 case 2:
44 number_of_multisamples = MS_NUMSAMPLES_2;
45 break;
46 case 4:
47 number_of_multisamples = MS_NUMSAMPLES_4;
48 break;
49 case 8:
50 number_of_multisamples = MS_NUMSAMPLES_8;
51 break;
52 case 16:
53 number_of_multisamples = MS_NUMSAMPLES_16;
54 break;
55 default:
56 assert(!"Unrecognized num_samples in gen8_emit_3dstate_multisample");
57 break;
58 }
59
60 BEGIN_BATCH(2);
61 OUT_BATCH(GEN8_3DSTATE_MULTISAMPLE << 16 | (2 - 2));
62 OUT_BATCH(MS_PIXEL_LOCATION_CENTER | number_of_multisamples);
63 ADVANCE_BATCH();
64 }
65
66 /**
67 * 3DSTATE_SAMPLE_PATTERN
68 */
69 void
70 gen8_emit_3dstate_sample_pattern(struct brw_context *brw)
71 {
72 BEGIN_BATCH(9);
73 OUT_BATCH(_3DSTATE_SAMPLE_PATTERN << 16 | (9 - 2));
74
75 /* 16x MSAA
76 * XXX: Need to program these.
77 */
78 OUT_BATCH(0);
79 OUT_BATCH(0);
80 OUT_BATCH(0);
81 OUT_BATCH(0);
82
83 /* 8x MSAA */
84 OUT_BATCH(brw_multisample_positions_8x[1]); /* sample positions 7654 */
85 OUT_BATCH(brw_multisample_positions_8x[0]); /* sample positions 3210 */
86
87 /* 4x MSAA */
88 OUT_BATCH(brw_multisample_positions_4x[0]);
89
90 /* 2x and 1x MSAA patterns
91 * XXX: need to program 2x.
92 */
93 OUT_BATCH(0x00880000);
94 ADVANCE_BATCH();
95 }
96
97
98 static void
99 upload_multisample_state(struct brw_context *brw)
100 {
101 struct gl_context *ctx = &brw->ctx;
102
103 /* _NEW_BUFFERS, _NEW_MULTISAMPLE */
104 unsigned num_samples = ctx->DrawBuffer->Visual.samples;
105
106 gen8_emit_3dstate_multisample(brw, num_samples);
107 gen6_emit_3dstate_sample_mask(brw, gen6_determine_sample_mask(brw));
108 }
109
110 const struct brw_tracked_state gen8_multisample_state = {
111 .dirty = {
112 .mesa = _NEW_BUFFERS | _NEW_MULTISAMPLE,
113 .brw = BRW_NEW_CONTEXT,
114 .cache = 0
115 },
116 .emit = upload_multisample_state
117 };