1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org develop this 3D driver.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Permission is hereby granted, free of charge, to any person obtaining
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org distribute, sublicense, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next paragraph) shall be included in all copies or substantial
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  * Authors:
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  *   Keith Whitwell <keith@tungstengraphics.com>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef BRWCONTEXT_INC
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRWCONTEXT_INC
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_context.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_structs.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" {
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Glossary:
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * URB - uniform resource buffer.  A mid-sized buffer which is
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * partitioned between the fixed function units and used for passing
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * values (vertices, primitives, constants) between them.
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CURBE - constant URB entry.  An urb region (entry) used to hold
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * constant values which the fixed function units can be instructed to
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * preload into the GRF when spawning a thread.
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * VUE - vertex URB entry.  An urb entry holding a vertex and usually
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a vertex header.  The header contains control information and
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * things like primitive type, Begin/end flags and clip codes.
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * PUE - primitive URB entry.  An urb entry produced by the setup (SF)
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * unit holding rasterization and interpolation parameters.
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GRF - general register file.  One of several register files
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * addressable by programmed threads.  The inputs (r0, payload, curbe,
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * urb) of the thread are preloaded to this area before the thread is
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * spawned.  The registers are individually 8 dwords wide and suitable
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for general usage.  Registers holding thread input values are not
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * special and may be overwritten.
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MRF - message register file.  Threads communicate (and terminate)
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * by sending messages.  Message parameters are placed in contiguous
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MRF registers.  All program output is via these messages.  URB
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * entries are populated by sending a message to the shared URB
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * function containing the new data, together with a control word,
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * often an unmodified copy of R0.
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * R0 - GRF register 0.  Typically holds control information used when
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sending messages to other threads.
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EU or GEN4 EU: The name of the programmable subsystem of the
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * i965 hardware.  Threads are executed by the EU, the registers
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * described above are part of the EU architecture.
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fixed function units:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CS - Command streamer.  Notional first unit, little software
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * interaction.  Holds the URB entries used for constant data, ie the
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CURBEs.
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * VF/VS - Vertex Fetch / Vertex Shader.  The fixed function part of
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this unit is responsible for pulling vertices out of vertex buffers
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in vram and injecting them into the processing pipe as VUEs.  If
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * enabled, it first passes them to a VS thread which is a good place
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for the driver to implement any active vertex shader.
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GS - Geometry Shader.  This corresponds to a new DX10 concept.  If
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * enabled, incoming strips etc are passed to GS threads in individual
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * line/triangle/point units.  The GS thread may perform arbitary
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * computation and emit whatever primtives with whatever vertices it
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * chooses.  This makes GS an excellent place to implement GL's
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * unfilled polygon modes, though of course it is capable of much
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * more.  Additionally, GS is used to translate away primitives not
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * handled by latter units, including Quads and Lineloops.
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CS - Clipper.  Mesa's clipping algorithms are imported to run on
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this unit.  The fixed function part performs cliptesting against
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the 6 fixed clipplanes and makes descisions on whether or not the
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * incoming primitive needs to be passed to a thread for clipping.
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * User clip planes are handled via cooperation with the VS thread.
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SF - Strips Fans or Setup: Triangles are prepared for
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rasterization.  Interpolation coefficients are calculated.
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flatshading and two-side lighting usually performed here.
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WM - Windower.  Interpolation of vertex attributes performed here.
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fragment shader implemented here.  SIMD aspects of EU taken full
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * advantage of, as pixels are processed in blocks of 16.
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CC - Color Calculator.  No EU threads associated with this unit.
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Handles blending and (presumably) depth and stencil testing.
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_MAX_CURBE                    (32*16)
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_context;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_vs_prog_key;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_wm_prog_key;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_wm_prog_data;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum brw_state_id {
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_URB_FENCE,
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_FRAGMENT_PROGRAM,
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_VERTEX_PROGRAM,
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_INPUT_DIMENSIONS,
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_CURBE_OFFSETS,
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_REDUCED_PRIMITIVE,
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_PRIMITIVE,
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_CONTEXT,
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_WM_INPUT_DIMENSIONS,
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_PSP,
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_SURFACES,
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_VS_BINDING_TABLE,
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_GS_BINDING_TABLE,
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_PS_BINDING_TABLE,
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_INDICES,
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_VERTICES,
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_BATCH,
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_NR_WM_SURFACES,
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_NR_VS_SURFACES,
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_INDEX_BUFFER,
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_VS_CONSTBUF,
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_PROGRAM_CACHE,
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_STATE_BASE_ADDRESS,
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_STATE_SOL_INDICES,
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_URB_FENCE               (1 << BRW_STATE_URB_FENCE)
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_FRAGMENT_PROGRAM        (1 << BRW_STATE_FRAGMENT_PROGRAM)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_VERTEX_PROGRAM          (1 << BRW_STATE_VERTEX_PROGRAM)
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_INPUT_DIMENSIONS        (1 << BRW_STATE_INPUT_DIMENSIONS)
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_CURBE_OFFSETS           (1 << BRW_STATE_CURBE_OFFSETS)
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_REDUCED_PRIMITIVE       (1 << BRW_STATE_REDUCED_PRIMITIVE)
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_PRIMITIVE               (1 << BRW_STATE_PRIMITIVE)
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_CONTEXT                 (1 << BRW_STATE_CONTEXT)
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_WM_INPUT_DIMENSIONS     (1 << BRW_STATE_WM_INPUT_DIMENSIONS)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_PSP                     (1 << BRW_STATE_PSP)
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_SURFACES		(1 << BRW_STATE_SURFACES)
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_VS_BINDING_TABLE	(1 << BRW_STATE_VS_BINDING_TABLE)
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_GS_BINDING_TABLE	(1 << BRW_STATE_GS_BINDING_TABLE)
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_PS_BINDING_TABLE	(1 << BRW_STATE_PS_BINDING_TABLE)
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_INDICES			(1 << BRW_STATE_INDICES)
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_VERTICES		(1 << BRW_STATE_VERTICES)
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Used for any batch entry with a relocated pointer that will be used
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * by any 3D rendering.
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_BATCH                  (1 << BRW_STATE_BATCH)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** \see brw.state.depth_region */
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_INDEX_BUFFER           (1 << BRW_STATE_INDEX_BUFFER)
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_VS_CONSTBUF            (1 << BRW_STATE_VS_CONSTBUF)
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_PROGRAM_CACHE		(1 << BRW_STATE_PROGRAM_CACHE)
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_STATE_BASE_ADDRESS	(1 << BRW_STATE_STATE_BASE_ADDRESS)
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_NEW_SOL_INDICES		(1 << BRW_STATE_SOL_INDICES)
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_state_flags {
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** State update flags signalled by mesa internals */
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint mesa;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * State update flags signalled as the result of brw_tracked_state updates
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint brw;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** State update flags signalled by brw_state_cache.c searches */
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint cache;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_MASK		0x0000ff00
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_NOTYPE		(0 << 8)
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_BATCH		(1 << 8)
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_VERTEX_BUFFER	(5 << 8)
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_2D_MAP		(6 << 8)
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_CUBE_MAP		(7 << 8)
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_VOLUME_MAP	(9 << 8)
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_1D_MAP		(10 << 8)
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_CONSTANT_BUFFER	(11 << 8)
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_CONSTANT_URB	(12 << 8)
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_INDEX_BUFFER	(13 << 8)
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_GENERAL		(14 << 8)
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AUB_TRACE_TYPE_SURFACE		(15 << 8)
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * state_struct_type enum values are encoded with the top 16 bits representing
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the type to be delivered to the .aub file, and the bottom 16 bits
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * representing the subtype.  This macro performs the encoding.
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ENCODE_SS_TYPE(type, subtype) (((type) << 16) | (subtype))
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum state_struct_type {
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_VS_STATE =			ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 1),
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_GS_STATE =			ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 2),
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_CLIP_STATE =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 3),
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_SF_STATE =			ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 4),
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_WM_STATE =			ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 5),
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_CC_STATE =			ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 6),
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_CLIP_VP_STATE =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 7),
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_SF_VP_STATE =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 8),
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_CC_VP_STATE =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 0x9),
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_SAMPLER_STATE =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 0xa),
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_KERNEL_INSTRUCTIONS =	ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 0xb),
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_SCRATCH_SPACE =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 0xc),
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_SAMPLER_DEFAULT_COLOR =    ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 0xd),
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_SCISSOR_STATE =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 0x15),
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_BLEND_STATE =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 0x16),
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_DEPTH_STENCIL_STATE =	ENCODE_SS_TYPE(AUB_TRACE_TYPE_GENERAL, 0x17),
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_VERTEX_BUFFER =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_VERTEX_BUFFER, 0),
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_BINDING_TABLE =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_SURFACE, 0x100),
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_SURFACE_STATE =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_SURFACE, 0x200),
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_VS_CONSTANTS =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_CONSTANT_BUFFER, 0),
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   AUB_TRACE_WM_CONSTANTS =		ENCODE_SS_TYPE(AUB_TRACE_TYPE_CONSTANT_BUFFER, 1),
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Decode a state_struct_type value to determine the type that should be
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stored in the .aub file.
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline uint32_t AUB_TRACE_TYPE(enum state_struct_type ss_type)
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (ss_type & 0xFFFF0000) >> 16;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Decode a state_struct_type value to determine the subtype that should be
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stored in the .aub file.
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline uint32_t AUB_TRACE_SUBTYPE(enum state_struct_type ss_type)
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ss_type & 0xFFFF;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Subclass of Mesa vertex program */
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_vertex_program {
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_vertex_program program;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint id;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool use_const_buffer;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Subclass of Mesa fragment program */
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_fragment_program {
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_fragment_program program;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint id;  /**< serial no. to identify frag progs, never re-used */
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_shader {
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_shader base;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool compiled_once;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Shader IR transformed for native compile, at link time. */
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct exec_list *ir;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_shader_program {
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_shader_program base;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Data about a particular attempt to compile a program.  Note that
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * there can be many of these, each in a different GL state
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * corresponding to a different brw_wm_prog_key struct, with different
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * compiled programs:
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_wm_prog_data {
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint curb_read_length;
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint urb_read_length;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint first_curbe_grf;
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint first_curbe_grf_16;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint reg_blocks;
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint reg_blocks_16;
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint total_scratch;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint nr_params;       /**< number of float params/constants */
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint nr_pull_params;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool error;
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool dual_src_blend;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int dispatch_width;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t prog_offset_16;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Mask of which interpolation modes are required by the fragment shader.
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Used in hardware setup on gen6+.
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t barycentric_interp_modes;
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Pointer to tracked values (only valid once
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * _mesa_load_state_parameters has been called at runtime).
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const float *param[MAX_UNIFORMS * 4]; /* should be: BRW_MAX_CURBE */
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const float *pull_param[MAX_UNIFORMS * 4];
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Enum representing the i965-specific vertex results that don't correspond
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * exactly to any element of gl_vert_result.  The values of this enum are
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * assigned such that they don't conflict with gl_vert_result.
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_VERT_RESULT_NDC = VERT_RESULT_MAX,
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_VERT_RESULT_HPOS_DUPLICATE,
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_VERT_RESULT_PAD,
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * It's actually not a vert_result but just a _mark_ to let sf aware that
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * he need do something special to handle gl_PointCoord builtin variable
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * correctly. see compile_sf_prog() for more info.
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_VERT_RESULT_PNTC,
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_VERT_RESULT_MAX
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} brw_vert_result;
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Data structure recording the relationship between the gl_vert_result enum
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and "slots" within the vertex URB entry (VUE).  A "slot" is defined as a
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * single octaword within the VUE (128 bits).
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that each BRW register contains 256 bits (2 octawords), so when
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * accessing the VUE in URB_NOSWIZZLE mode, each register corresponds to two
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * consecutive VUE slots.  When accessing the VUE in URB_INTERLEAVED mode (as
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in a vertex shader), each register corresponds to a single VUE slot, since
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it contains data for two separate vertices.
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_vue_map {
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Map from gl_vert_result value to VUE slot.  For gl_vert_results that are
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * not stored in a slot (because they are not written, or because
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * additional processing is applied before storing them in the VUE), the
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * value is -1.
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int vert_result_to_slot[BRW_VERT_RESULT_MAX];
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Map from VUE slot to gl_vert_result value.  For slots that do not
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * directly correspond to a gl_vert_result, the value comes from
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * brw_vert_result.
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * For slots that are not in use, the value is BRW_VERT_RESULT_MAX (this
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * simplifies code that uses the value stored in slot_to_vert_result to
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * create a bit mask).
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int slot_to_vert_result[BRW_VERT_RESULT_MAX];
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Total number of VUE slots in use
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int num_slots;
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert a VUE slot number into a byte offset within the VUE.
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLuint brw_vue_slot_to_offset(GLuint slot)
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 16*slot;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert a vert_result into a byte offset within the VUE.
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLuint brw_vert_result_to_offset(struct brw_vue_map *vue_map,
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               GLuint vert_result)
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return brw_vue_slot_to_offset(vue_map->vert_result_to_slot[vert_result]);
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_sf_prog_data {
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint urb_read_length;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint total_grf;
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Each vertex may have upto 12 attributes, 4 components each,
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * except WPOS which requires only 2.  (11*4 + 2) == 44 ==> 11
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * rows.
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Actually we use 4 for each, so call it 12 rows.
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint urb_entry_size;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_clip_prog_data {
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint curb_read_length;	/* user planes? */
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint clip_mode;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint urb_read_length;
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint total_grf;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_gs_prog_data {
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint urb_read_length;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint total_grf;
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Gen6 transform feedback: Amount by which the streaming vertex buffer
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * indices should be incremented each time the GS is invoked.
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned svbi_postincrement_value;
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_vs_prog_data {
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_vue_map vue_map;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint curb_read_length;
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint urb_read_length;
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint total_grf;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield64 outputs_written;
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint nr_params;       /**< number of float params/constants */
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint nr_pull_params; /**< number of dwords referenced by pull_param[] */
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint total_scratch;
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield64 inputs_read;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Used for calculating urb partitions:
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint urb_entry_size;
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const float *param[MAX_UNIFORMS * 4]; /* should be: BRW_MAX_CURBE */
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const float *pull_param[MAX_UNIFORMS * 4];
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool uses_new_param_layout;
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool uses_vertexid;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool userclip;
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int num_surfaces;
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Size == 0 if output either not written, or always [0,0,0,1]
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_vs_ouput_sizes {
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte output_size[VERT_RESULT_MAX];
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Number of texture sampler units */
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_MAX_TEX_UNIT 16
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Max number of render targets in a shader */
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_MAX_DRAW_BUFFERS 8
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Max number of binding table entries used for stream output.
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * From the OpenGL 3.0 spec, table 6.44 (Transform Feedback State), the
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * minimum value of MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS is 64.
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * On Gen6, the size of transform feedback data is limited not by the number
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of components but by the number of binding table entries we set aside.  We
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use one binding table entry for a float, one entry for a vector, and one
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * entry per matrix column.  Since the only way we can communicate our
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * transform feedback capabilities to the client is via
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, we need to plan for the
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * worst case, in which all the varyings are floats, so we use up one binding
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * table entry per component.  Therefore we need to set aside at least 64
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * binding table entries for use by transform feedback.
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: since we don't currently pack varyings, it is currently impossible
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for the client to actually use up all of these binding table entries--if
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all of their varyings were floats, they would run out of varying slots and
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fail to link.  But that's a bug, so it seems prudent to go ahead and
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * allocate the number of binding table entries we will need once the bug is
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fixed.
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_MAX_SOL_BINDINGS 64
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Maximum number of actual buffers used for stream output */
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_MAX_SOL_BUFFERS 4
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_MAX_WM_UBOS              12
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_MAX_VS_UBOS              12
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helpers to create Surface Binding Table indexes for draw buffers,
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * textures, and constant buffers.
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Shader threads access surfaces via numeric handles, rather than directly
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * using pointers.  The binding table maps these numeric handles to the
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * address of the actual buffer.
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For example, a shader might ask to sample from "surface 7."  In this case,
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * bind[7] would contain a pointer to a texture.
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Currently, our WM binding tables are (arbitrarily) programmed as follows:
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    +-------------------------------+
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   0 | Draw buffer 0           |
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   . |     .                   |
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   : |     :                   |
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   7 | Draw buffer 7           |
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |-----|-------------------------|
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   8 | WM Pull Constant Buffer |
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |-----|-------------------------|
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   9 | Texture 0               |
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   . |     .                   |
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   : |     :                   |
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |  24 | Texture 15              |
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |-----|-------------------------|
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |  25 | UBO 0                   |
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   . |     .                   |
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   : |     :                   |
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |  36 | UBO 11                  |
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    +-------------------------------+
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Our VS binding tables are programmed as follows:
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    +-----+-------------------------+
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   0 | VS Pull Constant Buffer |
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    +-----+-------------------------+
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   1 | Texture 0               |
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   . |     .                   |
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   : |     :                   |
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |  16 | Texture 15              |
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    +-----+-------------------------+
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |  17 | UBO 0                   |
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   . |     .                   |
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   : |     :                   |
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |  28 | UBO 11                  |
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    +-------------------------------+
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Our (gen6) GS binding tables are programmed as follows:
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    +-----+-------------------------+
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   0 | SOL Binding 0           |
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   . |     .                   |
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |   : |     :                   |
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    |  63 | SOL Binding 63          |
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    +-----+-------------------------+
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that nothing actually uses the SURF_INDEX_DRAW macro, so it has to be
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the identity function or things will break.  We do want to keep draw buffers
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * first so we can use headerless render target writes for RT 0.
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SURF_INDEX_DRAW(d)           (d)
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SURF_INDEX_FRAG_CONST_BUFFER (BRW_MAX_DRAW_BUFFERS + 1)
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SURF_INDEX_TEXTURE(t)        (BRW_MAX_DRAW_BUFFERS + 2 + (t))
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SURF_INDEX_WM_UBO(u)         (SURF_INDEX_TEXTURE(BRW_MAX_TEX_UNIT) + u)
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Maximum size of the binding table. */
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_MAX_WM_SURFACES          SURF_INDEX_WM_UBO(BRW_MAX_WM_UBOS)
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SURF_INDEX_VERT_CONST_BUFFER (0)
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SURF_INDEX_VS_TEXTURE(t)     (SURF_INDEX_VERT_CONST_BUFFER + 1 + (t))
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SURF_INDEX_VS_UBO(u)         (SURF_INDEX_VS_TEXTURE(BRW_MAX_TEX_UNIT) + u)
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_MAX_VS_SURFACES          SURF_INDEX_VS_UBO(BRW_MAX_VS_UBOS)
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SURF_INDEX_SOL_BINDING(t)    ((t))
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_MAX_GS_SURFACES          SURF_INDEX_SOL_BINDING(BRW_MAX_SOL_BINDINGS)
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum brw_cache_id {
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_BLEND_STATE,
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_DEPTH_STENCIL_STATE,
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_COLOR_CALC_STATE,
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_CC_VP,
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_CC_UNIT,
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_WM_PROG,
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_BLORP_BLIT_PROG,
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_SAMPLER,
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_WM_UNIT,
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_SF_PROG,
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_SF_VP,
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_SF_UNIT, /* scissor state on gen6 */
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_VS_UNIT,
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_VS_PROG,
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_GS_UNIT,
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_GS_PROG,
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_CLIP_VP,
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_CLIP_UNIT,
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_CLIP_PROG,
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BRW_MAX_CACHE
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_cache_item {
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Effectively part of the key, cache_id identifies what kind of state
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * buffer is involved, and also which brw->state.dirty.cache flag should
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * be set when this cache item is chosen.
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum brw_cache_id cache_id;
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** 32-bit hash of the key data */
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint hash;
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint key_size;		/* for variable-sized keys */
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint aux_size;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const void *key;
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t offset;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t size;
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_cache_item *next;
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_cache {
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_context *brw;
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_cache_item **items;
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo *bo;
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint size, n_items;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t next_offset;
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool bo_used_by_gpu;
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Considered adding a member to this struct to document which flags
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * an update might raise so that ordering of the state atoms can be
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * checked or derived at runtime.  Dropped the idea in favor of having
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a debug mode where the state is monitored for flags which are
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * raised that have already been tested against.
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_tracked_state {
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_state_flags dirty;
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (*emit)( struct brw_context *brw );
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Flags for brw->state.cache.
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_BLEND_STATE            (1<<BRW_BLEND_STATE)
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_DEPTH_STENCIL_STATE    (1<<BRW_DEPTH_STENCIL_STATE)
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_COLOR_CALC_STATE       (1<<BRW_COLOR_CALC_STATE)
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_CC_VP                  (1<<BRW_CC_VP)
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_CC_UNIT                (1<<BRW_CC_UNIT)
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_WM_PROG                (1<<BRW_WM_PROG)
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_SAMPLER                (1<<BRW_SAMPLER)
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_WM_UNIT                (1<<BRW_WM_UNIT)
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_SF_PROG                (1<<BRW_SF_PROG)
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_SF_VP                  (1<<BRW_SF_VP)
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_SF_UNIT                (1<<BRW_SF_UNIT)
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_VS_UNIT                (1<<BRW_VS_UNIT)
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_VS_PROG                (1<<BRW_VS_PROG)
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_GS_UNIT                (1<<BRW_GS_UNIT)
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_GS_PROG                (1<<BRW_GS_PROG)
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_CLIP_VP                (1<<BRW_CLIP_VP)
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_CLIP_UNIT              (1<<BRW_CLIP_UNIT)
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CACHE_NEW_CLIP_PROG              (1<<BRW_CLIP_PROG)
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_cached_batch_item {
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct header *header;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint sz;
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_cached_batch_item *next;
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Protect against a future where VERT_ATTRIB_MAX > 32.  Wouldn't life
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be easier if C allowed arrays of packed elements?
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ATTRIB_BIT_DWORDS  ((VERT_ATTRIB_MAX+31)/32)
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_vertex_buffer {
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Buffer object containing the uploaded vertex data */
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo *bo;
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t offset;
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Byte stride between elements in the uploaded array */
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint stride;
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint step_rate;
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_vertex_element {
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_client_array *glarray;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int buffer;
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** The corresponding Mesa vertex attribute */
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_vert_attrib attrib;
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Size of a complete element */
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint element_size;
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Offset of the first element within the buffer object */
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int offset;
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_vertex_info {
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint sizes[ATTRIB_BIT_DWORDS * 2]; /* sizes:2[VERT_ATTRIB_MAX] */
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_query_object {
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_query_object Base;
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Last query BO associated with this query. */
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo *bo;
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** First index in bo with query data for this object. */
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int first_index;
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Last index in bo with query data for this object. */
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int last_index;
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * brw_context is derived from intel_context.
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_context
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context intel;  /**< base class, must be first field */
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint primitive; /**< Hardware primitive, such as _3DPRIM_TRILIST. */
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool emit_state_always;
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool has_surface_tile_offset;
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool has_compr4;
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool has_negative_rhw_bug;
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool has_aa_line_parameters;
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool has_pln;
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool precompile;
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Some versions of Gen hardware don't do centroid interpolation correctly
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * on unlit pixels, causing incorrect values for derivatives near triangle
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * edges.  Enabling this flag causes the fragment shader to use
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * non-centroid interpolation for unlit pixels, at the expense of two extra
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * fragment shader instructions.
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool needs_unlit_centroid_workaround;
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_state_flags dirty;
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } state;
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_cache cache;
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_cached_batch_item *cached_batch_items;
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_vertex_element inputs[VERT_ATTRIB_MAX];
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_vertex_buffer buffers[VERT_ATTRIB_MAX];
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct {
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      uint32_t handle;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      uint32_t offset;
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      uint32_t stride;
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      uint32_t step_rate;
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } current_buffers[VERT_ATTRIB_MAX];
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_vertex_element *enabled[VERT_ATTRIB_MAX];
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint nr_enabled;
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint nr_buffers, nr_current_buffers;
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Summary of size and varying of active arrays, so we can check
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * for changes to this state:
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_vertex_info info;
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned int min_index, max_index;
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Offset from start of vertex buffer so we can avoid redefining
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * the same VB packed over and over again.
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned int start_vertex_bias;
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } vb;
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /**
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Index buffer for this draw_prims call.
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Updates are signaled by BRW_NEW_INDICES.
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct _mesa_index_buffer *ib;
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Updates are signaled by BRW_NEW_INDEX_BUFFER. */
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo *bo;
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint type;
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Offset to index buffer index to use in CMD_3D_PRIM so that we can
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * avoid re-uploading the IB packet over and over if we're actually
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * referencing the same index buffer.
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned int start_vertex_offset;
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } ib;
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Active vertex program:
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_vertex_program *vertex_program;
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_fragment_program *fragment_program;
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* hw-dependent 3DSTATE_VF_STATISTICS opcode */
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t CMD_VF_STATISTICS;
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* hw-dependent 3DSTATE_PIPELINE_SELECT opcode */
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t CMD_PIPELINE_SELECT;
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Platform specific constants containing the maximum number of threads
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * for each pipeline stage.
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int max_vs_threads;
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int max_gs_threads;
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int max_wm_threads;
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* BRW_NEW_URB_ALLOCATIONS:
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint vsize;		/* vertex size plus header in urb registers */
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint csize;		/* constant buffer size in urb registers */
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint sfsize;		/* setup data size in urb registers */
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool constrained;
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint max_vs_entries;	/* Maximum number of VS entries */
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint max_gs_entries;	/* Maximum number of GS entries */
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint nr_vs_entries;
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint nr_gs_entries;
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint nr_clip_entries;
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint nr_sf_entries;
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint nr_cs_entries;
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* gen6:
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * The length of each URB entry owned by the VS (or GS), as
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * a number of 1024-bit (128-byte) rows.  Should be >= 1.
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * gen7: Same meaning, but in 512-bit (64-byte) rows.
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint vs_size;
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint gs_size;
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint vs_start;
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint gs_start;
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint clip_start;
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint sf_start;
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint cs_start;
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint size; /* Hardware URB size, in KB. */
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* gen6: True if the most recently sent _3DSTATE_URB message allocated
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * URB space for the GS.
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool gen6_gs_previously_active;
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } urb;
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* BRW_NEW_CURBE_OFFSETS:
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint wm_start;  /**< pos of first wm const in CURBE buffer */
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint wm_size;   /**< number of float[4] consts, multiple of 16 */
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint clip_start;
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint clip_size;
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint vs_start;
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint vs_size;
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint total_size;
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo *curbe_bo;
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** Offset within curbe_bo of space for current curbe entry */
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint curbe_offset;
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** Offset within curbe_bo of space for next curbe entry */
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint curbe_next_offset;
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /**
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Copy of the last set of CURBEs uploaded.  Frequently we'll end up
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * in brw_curbe.c with the same set of constant data to be uploaded,
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * so we'd rather not upload new constants in that case (it can cause
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * a pipeline bubble since only up to 4 can be pipelined at a time).
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat *last_buf;
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /**
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Allocation for where to calculate the next set of CURBEs.
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * It's a hot enough path that malloc/free of that data matters.
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat *next_buf;
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint last_bufsz;
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } curbe;
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** SAMPLER_STATE count and offset */
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint count;
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t offset;
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } sampler;
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_vs_prog_data *prog_data;
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int8_t *constant_map; /* variable array following prog_data */
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo *scratch_bo;
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo *const_bo;
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** Offset in the program cache to the VS program */
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t prog_offset;
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t state_offset;
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t push_const_offset; /* Offset in the batchbuffer */
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int push_const_size; /* in 256-bit register increments */
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** @{ register allocator */
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct ra_regs *regs;
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /**
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Array of the ra classes for the unaligned contiguous register
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * block sizes used.
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int *classes;
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /**
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Mapping for register-allocated objects in *regs to the first
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * GRF for that object.
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      */
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t *ra_reg_to_grf;
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** @} */
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t bind_bo_offset;
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t surf_offset[BRW_MAX_VS_SURFACES];
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } vs;
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_gs_prog_data *prog_data;
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool prog_active;
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** Offset in the program cache to the CLIP program pre-gen6 */
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t prog_offset;
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t state_offset;
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t bind_bo_offset;
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t surf_offset[BRW_MAX_GS_SURFACES];
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } gs;
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_clip_prog_data *prog_data;
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** Offset in the program cache to the CLIP program pre-gen6 */
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t prog_offset;
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Offset in the batch to the CLIP state on pre-gen6. */
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t state_offset;
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* As of gen6, this is the offset in the batch to the CLIP VP,
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * instead of vp_bo.
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t vp_offset;
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } clip;
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_sf_prog_data *prog_data;
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** Offset in the program cache to the CLIP program pre-gen6 */
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t prog_offset;
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t state_offset;
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t vp_offset;
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } sf;
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_wm_prog_data *prog_data;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_wm_compile *compile_data;
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** Input sizes, calculated from active vertex program.
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * One bit per fragment program input attribute.
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLbitfield input_size_masks[4];
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** offsets in the batch to sampler default colors (texture border color)
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t sdc_offset[BRW_MAX_TEX_UNIT];
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint render_surf;
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo *scratch_bo;
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /**
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Buffer object used in place of multisampled null render targets on
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Gen6.  See brw_update_null_renderbuffer_surface().
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo *multisampled_null_render_target_bo;
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** Offset in the program cache to the WM program */
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t prog_offset;
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t state_offset; /* offset in batchbuffer to pre-gen6 WM state */
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo *const_bo; /* pull constant buffer. */
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /**
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * This is offset in the batch to the push constants on gen6.
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Pre-gen6, push constants live in the CURBE.
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t push_const_offset;
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** Binding table of pointers to surf_bo entries */
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t bind_bo_offset;
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t surf_offset[BRW_MAX_WM_SURFACES];
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** @{ register allocator */
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct ra_regs *regs;
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** Array of the ra classes for the unaligned contiguous
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * register block sizes used.
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int *classes;
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /**
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Mapping for register-allocated objects in *regs to the first
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * GRF for that object.
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      */
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t *ra_reg_to_grf;
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /**
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * ra class for the aligned pairs we use for PLN, which doesn't
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * appear in *classes.
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int aligned_pairs_class;
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /** @} */
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } wm;
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t state_offset;
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t blend_state_offset;
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t depth_stencil_state_offset;
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t vp_offset;
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } cc;
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_query_object *obj;
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo *bo;
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int index;
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool active;
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } query;
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Used to give every program string a unique id
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint program_id;
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int num_atoms;
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct brw_tracked_state **atoms;
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* If (INTEL_DEBUG & DEBUG_BATCH) */
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t offset;
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t size;
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      enum state_struct_type type;
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } *state_batch_list;
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int state_batch_count;
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_sol_state {
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t svbi_0_starting_index;
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t svbi_0_max_index;
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t offset_0_batch_start;
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t primitives_generated;
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t primitives_written;
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool counting_primitives_generated;
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool counting_primitives_written;
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } sol;
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t render_target_format[MESA_FORMAT_COUNT];
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool format_supported_as_render_target[MESA_FORMAT_COUNT];
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* PrimitiveRestart */
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool in_progress;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool enable_cut_index;
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } prim_restart;
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t num_instances;
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BRW_PACKCOLOR8888(r,g,b,a)  ((r<<24) | (g<<16) | (b<<8) | a)
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction_info {
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    char    *name;
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int	    nsrc;
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int	    ndst;
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    bool is_arith;
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern const struct brw_instruction_info brw_opcodes[128];
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*======================================================================
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * brw_vtbl.c
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brwInitVtbl( struct brw_context *brw );
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*======================================================================
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * brw_context.c
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool brwCreateContext(int api,
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      const struct gl_config *mesaVis,
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      __DRIcontext *driContextPriv,
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned major_version,
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned minor_version,
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      uint32_t flags,
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned *error,
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      void *sharedContextPrivate);
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*======================================================================
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * brw_queryobj.c
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_init_queryobj_functions(struct dd_function_table *functions);
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_prepare_query_begin(struct brw_context *brw);
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_emit_query_begin(struct brw_context *brw);
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_emit_query_end(struct brw_context *brw);
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*======================================================================
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * brw_state_dump.c
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_debug_batch(struct intel_context *intel);
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_annotate_aub(struct intel_context *intel);
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*======================================================================
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * brw_tex.c
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_validate_textures( struct brw_context *brw );
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*======================================================================
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * brw_program.c
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brwInitFragProgFuncs( struct dd_function_table *functions );
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint brw_get_scratch_size(int size);
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_get_scratch_bo(struct intel_context *intel,
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			drm_intel_bo **scratch_bo, int size);
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* brw_urb.c
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_upload_urb_fence(struct brw_context *brw);
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* brw_curbe.c
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_upload_cs_urb_state(struct brw_context *brw);
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* brw_disasm.c */
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint brw_disasm (FILE *file, struct brw_instruction *inst, int gen);
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* brw_vs.c */
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_clip_plane *brw_select_clip_planes(struct gl_context *ctx);
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* brw_wm_surface_state.c */
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_init_surface_formats(struct brw_context *brw);
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_update_sol_surface(struct brw_context *brw,
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       struct gl_buffer_object *buffer_obj,
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       uint32_t *out_offset, unsigned num_vector_components,
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned stride_dwords, unsigned offset_dwords);
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_upload_ubo_surfaces(struct brw_context *brw,
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     struct gl_shader *shader,
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     uint32_t *surf_offsets);
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* gen6_sol.c */
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_begin_transform_feedback(struct gl_context *ctx, GLenum mode,
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     struct gl_transform_feedback_object *obj);
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_end_transform_feedback(struct gl_context *ctx,
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           struct gl_transform_feedback_object *obj);
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* gen7_sol_state.c */
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen7_end_transform_feedback(struct gl_context *ctx,
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    struct gl_transform_feedback_object *obj);
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* brw_blorp_blit.cpp */
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLbitfield
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_blorp_framebuffer(struct intel_context *intel,
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLbitfield mask, GLenum filter);
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* gen6_multisample_state.c */
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_emit_3dstate_multisample(struct brw_context *brw,
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              unsigned num_samples);
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_emit_3dstate_sample_mask(struct brw_context *brw,
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              unsigned num_samples, float coverage,
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              bool coverage_invert);
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* gen7_urb.c */
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen7_allocate_push_constants(struct brw_context *brw);
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen7_emit_urb_state(struct brw_context *brw, GLuint nr_vs_entries,
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    GLuint vs_size, GLuint vs_start);
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*======================================================================
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Inline conversion functions.  These are better-typed than the
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * macros used previously:
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct brw_context *
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_context( struct gl_context *ctx )
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct brw_context *)ctx;
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct brw_vertex_program *
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_vertex_program(struct gl_vertex_program *p)
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct brw_vertex_program *) p;
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE const struct brw_vertex_program *
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_vertex_program_const(const struct gl_vertex_program *p)
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (const struct brw_vertex_program *) p;
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct brw_fragment_program *
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_fragment_program(struct gl_fragment_program *p)
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct brw_fragment_program *) p;
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE const struct brw_fragment_program *
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_fragment_program_const(const struct gl_fragment_program *p)
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (const struct brw_fragment_program *) p;
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pre-gen6, the register file of the EUs was shared between threads,
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and each thread used some subset allocated on a 16-register block
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * granularity.  The unit states wanted these block counts.
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_register_blocks(int reg_count)
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ALIGN(reg_count, 16) / 16 - 1;
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline uint32_t
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_program_reloc(struct brw_context *brw, uint32_t state_offset,
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  uint32_t prog_offset)
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen >= 5) {
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Using state base address. */
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return prog_offset;
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_emit_reloc(intel->batch.bo,
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   state_offset,
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   brw->cache.bo,
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   prog_offset,
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   I915_GEM_DOMAIN_INSTRUCTION, 0);
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return brw->cache.bo->offset + prog_offset;
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool brw_do_cubemap_normalize(struct exec_list *instructions);
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool brw_lower_texture_gradients(struct exec_list *instructions);
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1275