i965_3d.c revision 428d7b3d
1428d7b3dSmrg/*
2428d7b3dSmrg * Copyright � 2011 Intel Corporation
3428d7b3dSmrg *
4428d7b3dSmrg * Permission is hereby granted, free of charge, to any person obtaining a
5428d7b3dSmrg * copy of this software and associated documentation files (the "Software"),
6428d7b3dSmrg * to deal in the Software without restriction, including without limitation
7428d7b3dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8428d7b3dSmrg * and/or sell copies of the Software, and to permit persons to whom the
9428d7b3dSmrg * Software is furnished to do so, subject to the following conditions:
10428d7b3dSmrg *
11428d7b3dSmrg * The above copyright notice and this permission notice (including the next
12428d7b3dSmrg * paragraph) shall be included in all copies or substantial portions of the
13428d7b3dSmrg * Software.
14428d7b3dSmrg *
15428d7b3dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16428d7b3dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17428d7b3dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18428d7b3dSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19428d7b3dSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20428d7b3dSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21428d7b3dSmrg * DEALINGS IN THE SOFTWARE.
22428d7b3dSmrg */
23428d7b3dSmrg
24428d7b3dSmrg#ifdef HAVE_CONFIG_H
25428d7b3dSmrg#include "config.h"
26428d7b3dSmrg#endif
27428d7b3dSmrg
28428d7b3dSmrg#include <string.h>
29428d7b3dSmrg
30428d7b3dSmrg#include "intel.h"
31428d7b3dSmrg#include "intel_uxa.h"
32428d7b3dSmrg#include "i965_reg.h"
33428d7b3dSmrg#include "brw_defines.h"
34428d7b3dSmrg
35428d7b3dSmrgvoid
36428d7b3dSmrggen6_upload_invariant_states(intel_screen_private *intel)
37428d7b3dSmrg{
38428d7b3dSmrg	Bool ivb = INTEL_INFO(intel)->gen >= 070;
39428d7b3dSmrg
40428d7b3dSmrg	OUT_BATCH(BRW_PIPE_CONTROL | (4 - 2));
41428d7b3dSmrg	OUT_BATCH(BRW_PIPE_CONTROL_IS_FLUSH |
42428d7b3dSmrg		BRW_PIPE_CONTROL_WC_FLUSH |
43428d7b3dSmrg		BRW_PIPE_CONTROL_DEPTH_CACHE_FLUSH |
44428d7b3dSmrg		BRW_PIPE_CONTROL_NOWRITE);
45428d7b3dSmrg	OUT_BATCH(0); /* write address */
46428d7b3dSmrg	OUT_BATCH(0); /* write data */
47428d7b3dSmrg
48428d7b3dSmrg	OUT_BATCH(NEW_PIPELINE_SELECT | PIPELINE_SELECT_3D);
49428d7b3dSmrg
50428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_MULTISAMPLE | ((ivb ? 4 : 3) - 2));
51428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_MULTISAMPLE_PIXEL_LOCATION_CENTER |
52428d7b3dSmrg		GEN6_3DSTATE_MULTISAMPLE_NUMSAMPLES_1); /* 1 sample/pixel */
53428d7b3dSmrg	OUT_BATCH(0);
54428d7b3dSmrg	if (ivb)
55428d7b3dSmrg		OUT_BATCH(0);
56428d7b3dSmrg
57428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_SAMPLE_MASK | (2 - 2));
58428d7b3dSmrg	OUT_BATCH(1);
59428d7b3dSmrg
60428d7b3dSmrg	/* Set system instruction pointer */
61428d7b3dSmrg	OUT_BATCH(BRW_STATE_SIP | 0);
62428d7b3dSmrg	OUT_BATCH(0);
63428d7b3dSmrg}
64428d7b3dSmrg
65428d7b3dSmrgvoid
66428d7b3dSmrggen6_upload_viewport_state_pointers(intel_screen_private *intel,
67428d7b3dSmrg				    drm_intel_bo *cc_vp_bo)
68428d7b3dSmrg{
69428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_VIEWPORT_STATE_POINTERS |
70428d7b3dSmrg		GEN6_3DSTATE_VIEWPORT_STATE_MODIFY_CC |
71428d7b3dSmrg		(4 - 2));
72428d7b3dSmrg	OUT_BATCH(0);
73428d7b3dSmrg	OUT_BATCH(0);
74428d7b3dSmrg	OUT_RELOC(cc_vp_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
75428d7b3dSmrg}
76428d7b3dSmrg
77428d7b3dSmrgvoid
78428d7b3dSmrggen7_upload_viewport_state_pointers(intel_screen_private *intel,
79428d7b3dSmrg				    drm_intel_bo *cc_vp_bo)
80428d7b3dSmrg{
81428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_CC | (2 - 2));
82428d7b3dSmrg	OUT_RELOC(cc_vp_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
83428d7b3dSmrg
84428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CL | (2 - 2));
85428d7b3dSmrg	OUT_BATCH(0);
86428d7b3dSmrg}
87428d7b3dSmrg
88428d7b3dSmrgvoid
89428d7b3dSmrggen6_upload_urb(intel_screen_private *intel)
90428d7b3dSmrg{
91428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_URB | (3 - 2));
92428d7b3dSmrg	OUT_BATCH(((1 - 1) << GEN6_3DSTATE_URB_VS_SIZE_SHIFT) |
93428d7b3dSmrg		(24 << GEN6_3DSTATE_URB_VS_ENTRIES_SHIFT)); /* at least 24 on GEN6 */
94428d7b3dSmrg	OUT_BATCH((0 << GEN6_3DSTATE_URB_GS_SIZE_SHIFT) |
95428d7b3dSmrg		(0 << GEN6_3DSTATE_URB_GS_ENTRIES_SHIFT)); /* no GS thread */
96428d7b3dSmrg}
97428d7b3dSmrg
98428d7b3dSmrg/*
99428d7b3dSmrg * URB layout on GEN7
100428d7b3dSmrg * ----------------------------------------
101428d7b3dSmrg * | PS Push Constants (8KB) | VS entries |
102428d7b3dSmrg * ----------------------------------------
103428d7b3dSmrg */
104428d7b3dSmrgvoid
105428d7b3dSmrggen7_upload_urb(intel_screen_private *intel)
106428d7b3dSmrg{
107428d7b3dSmrg	unsigned int num_urb_entries = 32;
108428d7b3dSmrg
109428d7b3dSmrg	if (IS_HSW(intel))
110428d7b3dSmrg		num_urb_entries = 64;
111428d7b3dSmrg
112428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_PS | (2 - 2));
113428d7b3dSmrg	OUT_BATCH(8); /* in 1KBs */
114428d7b3dSmrg
115428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_URB_VS | (2 - 2));
116428d7b3dSmrg	OUT_BATCH(
117428d7b3dSmrg		(num_urb_entries << GEN7_URB_ENTRY_NUMBER_SHIFT) |
118428d7b3dSmrg		(2 - 1) << GEN7_URB_ENTRY_SIZE_SHIFT |
119428d7b3dSmrg		(1 << GEN7_URB_STARTING_ADDRESS_SHIFT));
120428d7b3dSmrg
121428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_URB_GS | (2 - 2));
122428d7b3dSmrg	OUT_BATCH((0 << GEN7_URB_ENTRY_SIZE_SHIFT) |
123428d7b3dSmrg		(1 << GEN7_URB_STARTING_ADDRESS_SHIFT));
124428d7b3dSmrg
125428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_URB_HS | (2 - 2));
126428d7b3dSmrg	OUT_BATCH((0 << GEN7_URB_ENTRY_SIZE_SHIFT) |
127428d7b3dSmrg		(2 << GEN7_URB_STARTING_ADDRESS_SHIFT));
128428d7b3dSmrg
129428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_URB_DS | (2 - 2));
130428d7b3dSmrg	OUT_BATCH((0 << GEN7_URB_ENTRY_SIZE_SHIFT) |
131428d7b3dSmrg		(2 << GEN7_URB_STARTING_ADDRESS_SHIFT));
132428d7b3dSmrg}
133428d7b3dSmrg
134428d7b3dSmrgvoid
135428d7b3dSmrggen6_upload_cc_state_pointers(intel_screen_private *intel,
136428d7b3dSmrg			      drm_intel_bo *blend_bo,
137428d7b3dSmrg			      drm_intel_bo *cc_bo,
138428d7b3dSmrg			      drm_intel_bo *depth_stencil_bo,
139428d7b3dSmrg			      uint32_t blend_offset)
140428d7b3dSmrg{
141428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_CC_STATE_POINTERS | (4 - 2));
142428d7b3dSmrg	if (blend_bo)
143428d7b3dSmrg		OUT_RELOC(blend_bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
144428d7b3dSmrg			  blend_offset | 1);
145428d7b3dSmrg	else
146428d7b3dSmrg		OUT_BATCH(0);
147428d7b3dSmrg
148428d7b3dSmrg	if (depth_stencil_bo)
149428d7b3dSmrg		OUT_RELOC(depth_stencil_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
150428d7b3dSmrg	else
151428d7b3dSmrg		OUT_BATCH(0);
152428d7b3dSmrg
153428d7b3dSmrg	if (cc_bo)
154428d7b3dSmrg		OUT_RELOC(cc_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
155428d7b3dSmrg	else
156428d7b3dSmrg		OUT_BATCH(0);
157428d7b3dSmrg}
158428d7b3dSmrg
159428d7b3dSmrgvoid
160428d7b3dSmrggen7_upload_cc_state_pointers(intel_screen_private *intel,
161428d7b3dSmrg			      drm_intel_bo *blend_bo,
162428d7b3dSmrg			      drm_intel_bo *cc_bo,
163428d7b3dSmrg			      drm_intel_bo *depth_stencil_bo,
164428d7b3dSmrg			      uint32_t blend_offset)
165428d7b3dSmrg{
166428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_BLEND_STATE_POINTERS | (2 - 2));
167428d7b3dSmrg	if (blend_bo)
168428d7b3dSmrg		OUT_RELOC(blend_bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
169428d7b3dSmrg			  blend_offset | 1);
170428d7b3dSmrg	else
171428d7b3dSmrg		OUT_BATCH(0);
172428d7b3dSmrg
173428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_CC_STATE_POINTERS | (2 - 2));
174428d7b3dSmrg	if (cc_bo)
175428d7b3dSmrg		OUT_RELOC(cc_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
176428d7b3dSmrg	else
177428d7b3dSmrg		OUT_BATCH(0);
178428d7b3dSmrg
179428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_DEPTH_STENCIL_STATE_POINTERS | (2 - 2));
180428d7b3dSmrg	if (depth_stencil_bo)
181428d7b3dSmrg		OUT_RELOC(depth_stencil_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
182428d7b3dSmrg	else
183428d7b3dSmrg		OUT_BATCH(0);
184428d7b3dSmrg}
185428d7b3dSmrg
186428d7b3dSmrgvoid
187428d7b3dSmrggen6_upload_sampler_state_pointers(intel_screen_private *intel,
188428d7b3dSmrg				   drm_intel_bo *sampler_bo)
189428d7b3dSmrg{
190428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_SAMPLER_STATE_POINTERS |
191428d7b3dSmrg		GEN6_3DSTATE_SAMPLER_STATE_MODIFY_PS |
192428d7b3dSmrg		(4 - 2));
193428d7b3dSmrg	OUT_BATCH(0); /* VS */
194428d7b3dSmrg	OUT_BATCH(0); /* GS */
195428d7b3dSmrg	OUT_RELOC(sampler_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
196428d7b3dSmrg}
197428d7b3dSmrg
198428d7b3dSmrgvoid
199428d7b3dSmrggen7_upload_sampler_state_pointers(intel_screen_private *intel,
200428d7b3dSmrg				   drm_intel_bo *sampler_bo)
201428d7b3dSmrg{
202428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_SAMPLER_STATE_POINTERS_PS | (2 - 2));
203428d7b3dSmrg	OUT_RELOC(sampler_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
204428d7b3dSmrg}
205428d7b3dSmrg
206428d7b3dSmrgvoid
207428d7b3dSmrggen7_upload_bypass_states(intel_screen_private *intel)
208428d7b3dSmrg{
209428d7b3dSmrg	/* bypass GS */
210428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_CONSTANT_GS | (7 - 2));
211428d7b3dSmrg	OUT_BATCH(0);
212428d7b3dSmrg	OUT_BATCH(0);
213428d7b3dSmrg	OUT_BATCH(0);
214428d7b3dSmrg	OUT_BATCH(0);
215428d7b3dSmrg	OUT_BATCH(0);
216428d7b3dSmrg	OUT_BATCH(0);
217428d7b3dSmrg
218428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_GS | (7 - 2));
219428d7b3dSmrg	OUT_BATCH(0); /* without GS kernel */
220428d7b3dSmrg	OUT_BATCH(0);
221428d7b3dSmrg	OUT_BATCH(0);
222428d7b3dSmrg	OUT_BATCH(0);
223428d7b3dSmrg	OUT_BATCH(0);
224428d7b3dSmrg	OUT_BATCH(0); /* pass-through */
225428d7b3dSmrg
226428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_BINDING_TABLE_POINTERS_GS | (2 - 2));
227428d7b3dSmrg	OUT_BATCH(0);
228428d7b3dSmrg
229428d7b3dSmrg	/* disable HS */
230428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_CONSTANT_HS | (7 - 2));
231428d7b3dSmrg	OUT_BATCH(0);
232428d7b3dSmrg	OUT_BATCH(0);
233428d7b3dSmrg	OUT_BATCH(0);
234428d7b3dSmrg	OUT_BATCH(0);
235428d7b3dSmrg	OUT_BATCH(0);
236428d7b3dSmrg	OUT_BATCH(0);
237428d7b3dSmrg
238428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_HS | (7 - 2));
239428d7b3dSmrg	OUT_BATCH(0);
240428d7b3dSmrg	OUT_BATCH(0);
241428d7b3dSmrg	OUT_BATCH(0);
242428d7b3dSmrg	OUT_BATCH(0);
243428d7b3dSmrg	OUT_BATCH(0);
244428d7b3dSmrg	OUT_BATCH(0);
245428d7b3dSmrg
246428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_BINDING_TABLE_POINTERS_HS | (2 - 2));
247428d7b3dSmrg	OUT_BATCH(0);
248428d7b3dSmrg
249428d7b3dSmrg	/* Disable TE */
250428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_TE | (4 - 2));
251428d7b3dSmrg	OUT_BATCH(0);
252428d7b3dSmrg	OUT_BATCH(0);
253428d7b3dSmrg	OUT_BATCH(0);
254428d7b3dSmrg
255428d7b3dSmrg	/* Disable DS */
256428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_CONSTANT_DS | (7 - 2));
257428d7b3dSmrg	OUT_BATCH(0);
258428d7b3dSmrg	OUT_BATCH(0);
259428d7b3dSmrg	OUT_BATCH(0);
260428d7b3dSmrg	OUT_BATCH(0);
261428d7b3dSmrg	OUT_BATCH(0);
262428d7b3dSmrg	OUT_BATCH(0);
263428d7b3dSmrg
264428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_DS | (6 - 2));
265428d7b3dSmrg	OUT_BATCH(0);
266428d7b3dSmrg	OUT_BATCH(0);
267428d7b3dSmrg	OUT_BATCH(0);
268428d7b3dSmrg	OUT_BATCH(0);
269428d7b3dSmrg	OUT_BATCH(0);
270428d7b3dSmrg
271428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_BINDING_TABLE_POINTERS_DS | (2 - 2));
272428d7b3dSmrg	OUT_BATCH(0);
273428d7b3dSmrg
274428d7b3dSmrg	/* Disable STREAMOUT */
275428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_STREAMOUT | (3 - 2));
276428d7b3dSmrg	OUT_BATCH(0);
277428d7b3dSmrg	OUT_BATCH(0);
278428d7b3dSmrg}
279428d7b3dSmrg
280428d7b3dSmrgvoid
281428d7b3dSmrggen6_upload_vs_state(intel_screen_private *intel)
282428d7b3dSmrg{
283428d7b3dSmrg	Bool ivb = INTEL_INFO(intel)->gen >= 070;
284428d7b3dSmrg	/* disable VS constant buffer */
285428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_CONSTANT_VS | ((ivb ? 7 : 5) - 2));
286428d7b3dSmrg	OUT_BATCH(0);
287428d7b3dSmrg	OUT_BATCH(0);
288428d7b3dSmrg	OUT_BATCH(0);
289428d7b3dSmrg	OUT_BATCH(0);
290428d7b3dSmrg	if (ivb) {
291428d7b3dSmrg		OUT_BATCH(0);
292428d7b3dSmrg		OUT_BATCH(0);
293428d7b3dSmrg	}
294428d7b3dSmrg
295428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_VS | (6 - 2));
296428d7b3dSmrg	OUT_BATCH(0); /* without VS kernel */
297428d7b3dSmrg	OUT_BATCH(0);
298428d7b3dSmrg	OUT_BATCH(0);
299428d7b3dSmrg	OUT_BATCH(0);
300428d7b3dSmrg	OUT_BATCH(0); /* pass-through */
301428d7b3dSmrg}
302428d7b3dSmrg
303428d7b3dSmrgvoid
304428d7b3dSmrggen6_upload_gs_state(intel_screen_private *intel)
305428d7b3dSmrg{
306428d7b3dSmrg	/* disable GS constant buffer */
307428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_CONSTANT_GS | (5 - 2));
308428d7b3dSmrg	OUT_BATCH(0);
309428d7b3dSmrg	OUT_BATCH(0);
310428d7b3dSmrg	OUT_BATCH(0);
311428d7b3dSmrg	OUT_BATCH(0);
312428d7b3dSmrg
313428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_GS | (7 - 2));
314428d7b3dSmrg	OUT_BATCH(0); /* without GS kernel */
315428d7b3dSmrg	OUT_BATCH(0);
316428d7b3dSmrg	OUT_BATCH(0);
317428d7b3dSmrg	OUT_BATCH(0);
318428d7b3dSmrg	OUT_BATCH(0);
319428d7b3dSmrg	OUT_BATCH(0); /* pass-through */
320428d7b3dSmrg}
321428d7b3dSmrg
322428d7b3dSmrgvoid
323428d7b3dSmrggen6_upload_clip_state(intel_screen_private *intel)
324428d7b3dSmrg{
325428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_CLIP | (4 - 2));
326428d7b3dSmrg	OUT_BATCH(0);
327428d7b3dSmrg	OUT_BATCH(0); /* pass-through */
328428d7b3dSmrg	OUT_BATCH(0);
329428d7b3dSmrg}
330428d7b3dSmrg
331428d7b3dSmrgvoid
332428d7b3dSmrggen6_upload_sf_state(intel_screen_private *intel,
333428d7b3dSmrg		     int num_sf_outputs,
334428d7b3dSmrg		     int read_offset)
335428d7b3dSmrg{
336428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_SF | (20 - 2));
337428d7b3dSmrg	OUT_BATCH((num_sf_outputs << GEN6_3DSTATE_SF_NUM_OUTPUTS_SHIFT) |
338428d7b3dSmrg		(1 << GEN6_3DSTATE_SF_URB_ENTRY_READ_LENGTH_SHIFT) |
339428d7b3dSmrg		(read_offset << GEN6_3DSTATE_SF_URB_ENTRY_READ_OFFSET_SHIFT));
340428d7b3dSmrg	OUT_BATCH(0);
341428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_SF_CULL_NONE);
342428d7b3dSmrg	OUT_BATCH(2 << GEN6_3DSTATE_SF_TRIFAN_PROVOKE_SHIFT); /* DW4 */
343428d7b3dSmrg	OUT_BATCH(0);
344428d7b3dSmrg	OUT_BATCH(0);
345428d7b3dSmrg	OUT_BATCH(0);
346428d7b3dSmrg	OUT_BATCH(0);
347428d7b3dSmrg	OUT_BATCH(0); /* DW9 */
348428d7b3dSmrg	OUT_BATCH(0);
349428d7b3dSmrg	OUT_BATCH(0);
350428d7b3dSmrg	OUT_BATCH(0);
351428d7b3dSmrg	OUT_BATCH(0);
352428d7b3dSmrg	OUT_BATCH(0); /* DW14 */
353428d7b3dSmrg	OUT_BATCH(0);
354428d7b3dSmrg	OUT_BATCH(0);
355428d7b3dSmrg	OUT_BATCH(0);
356428d7b3dSmrg	OUT_BATCH(0);
357428d7b3dSmrg	OUT_BATCH(0); /* DW19 */
358428d7b3dSmrg}
359428d7b3dSmrg
360428d7b3dSmrgvoid
361428d7b3dSmrggen7_upload_sf_state(intel_screen_private *intel,
362428d7b3dSmrg		     int num_sf_outputs,
363428d7b3dSmrg		     int read_offset)
364428d7b3dSmrg{
365428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_SBE | (14 - 2));
366428d7b3dSmrg	OUT_BATCH((num_sf_outputs << GEN7_SBE_NUM_OUTPUTS_SHIFT) |
367428d7b3dSmrg		(1 << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT) |
368428d7b3dSmrg		(read_offset << GEN7_SBE_URB_ENTRY_READ_OFFSET_SHIFT));
369428d7b3dSmrg	OUT_BATCH(0);
370428d7b3dSmrg	OUT_BATCH(0);
371428d7b3dSmrg	OUT_BATCH(0); /* DW4 */
372428d7b3dSmrg	OUT_BATCH(0);
373428d7b3dSmrg	OUT_BATCH(0);
374428d7b3dSmrg	OUT_BATCH(0);
375428d7b3dSmrg	OUT_BATCH(0);
376428d7b3dSmrg	OUT_BATCH(0); /* DW9 */
377428d7b3dSmrg	OUT_BATCH(0);
378428d7b3dSmrg	OUT_BATCH(0);
379428d7b3dSmrg	OUT_BATCH(0);
380428d7b3dSmrg	OUT_BATCH(0);
381428d7b3dSmrg
382428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_SF | (7 - 2));
383428d7b3dSmrg	OUT_BATCH(0);
384428d7b3dSmrg	OUT_BATCH(GEN6_3DSTATE_SF_CULL_NONE);
385428d7b3dSmrg	OUT_BATCH(2 << GEN6_3DSTATE_SF_TRIFAN_PROVOKE_SHIFT);
386428d7b3dSmrg	OUT_BATCH(0);
387428d7b3dSmrg	OUT_BATCH(0);
388428d7b3dSmrg	OUT_BATCH(0);
389428d7b3dSmrg}
390428d7b3dSmrg
391428d7b3dSmrgvoid
392428d7b3dSmrggen6_upload_binding_table(intel_screen_private *intel,
393428d7b3dSmrg			  uint32_t ps_binding_table_offset)
394428d7b3dSmrg{
395428d7b3dSmrg	/* Binding table pointers */
396428d7b3dSmrg	OUT_BATCH(BRW_3DSTATE_BINDING_TABLE_POINTERS |
397428d7b3dSmrg		  GEN6_3DSTATE_BINDING_TABLE_MODIFY_PS |
398428d7b3dSmrg		  (4 - 2));
399428d7b3dSmrg	OUT_BATCH(0); /* VS */
400428d7b3dSmrg	OUT_BATCH(0); /* GS */
401428d7b3dSmrg	/* Only the PS uses the binding table */
402428d7b3dSmrg	OUT_BATCH(ps_binding_table_offset);
403428d7b3dSmrg}
404428d7b3dSmrg
405428d7b3dSmrgvoid
406428d7b3dSmrggen7_upload_binding_table(intel_screen_private *intel,
407428d7b3dSmrg			  uint32_t ps_binding_table_offset)
408428d7b3dSmrg{
409428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_BINDING_TABLE_POINTERS_PS | (2 - 2));
410428d7b3dSmrg	OUT_BATCH(ps_binding_table_offset);
411428d7b3dSmrg}
412428d7b3dSmrg
413428d7b3dSmrgvoid
414428d7b3dSmrggen6_upload_depth_buffer_state(intel_screen_private *intel)
415428d7b3dSmrg{
416428d7b3dSmrg	OUT_BATCH(BRW_3DSTATE_DEPTH_BUFFER | (7 - 2));
417428d7b3dSmrg	OUT_BATCH((BRW_SURFACE_NULL << BRW_3DSTATE_DEPTH_BUFFER_TYPE_SHIFT) |
418428d7b3dSmrg		  (BRW_DEPTHFORMAT_D32_FLOAT << BRW_3DSTATE_DEPTH_BUFFER_FORMAT_SHIFT));
419428d7b3dSmrg	OUT_BATCH(0);
420428d7b3dSmrg	OUT_BATCH(0);
421428d7b3dSmrg	OUT_BATCH(0);
422428d7b3dSmrg	OUT_BATCH(0);
423428d7b3dSmrg	OUT_BATCH(0);
424428d7b3dSmrg
425428d7b3dSmrg	OUT_BATCH(BRW_3DSTATE_CLEAR_PARAMS | (2 - 2));
426428d7b3dSmrg	OUT_BATCH(0);
427428d7b3dSmrg}
428428d7b3dSmrg
429428d7b3dSmrgvoid
430428d7b3dSmrggen7_upload_depth_buffer_state(intel_screen_private *intel)
431428d7b3dSmrg{
432428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_DEPTH_BUFFER | (7 - 2));
433428d7b3dSmrg	OUT_BATCH((BRW_DEPTHFORMAT_D32_FLOAT << 18) | (BRW_SURFACE_NULL << 29));
434428d7b3dSmrg	OUT_BATCH(0);
435428d7b3dSmrg	OUT_BATCH(0);
436428d7b3dSmrg	OUT_BATCH(0);
437428d7b3dSmrg	OUT_BATCH(0);
438428d7b3dSmrg	OUT_BATCH(0);
439428d7b3dSmrg
440428d7b3dSmrg	OUT_BATCH(GEN7_3DSTATE_CLEAR_PARAMS | (3 - 2));
441428d7b3dSmrg	OUT_BATCH(0);
442428d7b3dSmrg	OUT_BATCH(0);
443428d7b3dSmrg}
444