1253066d716e3039522eeb7b072811cccd89b4a82José Fonseca /**************************************************************************
2253066d716e3039522eeb7b072811cccd89b4a82José Fonseca *
3253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * All Rights Reserved.
5253066d716e3039522eeb7b072811cccd89b4a82José Fonseca *
6253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * copy of this software and associated documentation files (the
8253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * "Software"), to deal in the Software without restriction, including
9253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * the following conditions:
13253066d716e3039522eeb7b072811cccd89b4a82José Fonseca *
14253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * The above copyright notice and this permission notice (including the
15253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * next paragraph) shall be included in all copies or substantial portions
16253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * of the Software.
17253066d716e3039522eeb7b072811cccd89b4a82José Fonseca *
18253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25253066d716e3039522eeb7b072811cccd89b4a82José Fonseca *
26253066d716e3039522eeb7b072811cccd89b4a82José Fonseca **************************************************************************/
27253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
28253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#ifndef I915_CONTEXT_H
29253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_CONTEXT_H
30253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
31253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
32253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#include "pipe/p_context.h"
33253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#include "pipe/p_defines.h"
34253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#include "pipe/p_state.h"
35253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
36253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#include "draw/draw_vertex.h"
37253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
38c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_scan.h"
39253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
407287964f944d7e2bcf409b758163ab75c61b0f8eJakob Bornecrantz#include "util/u_slab.h"
41fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter#include "util/u_blitter.h"
427287964f944d7e2bcf409b758163ab75c61b0f8eJakob Bornecrantz
43253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
44bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzstruct i915_winsys;
45bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzstruct i915_winsys_buffer;
46bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzstruct i915_winsys_batchbuffer;
47d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
48d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
49253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_TEX_UNITS 8
50253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
51253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_DYNAMIC_MODES4       0
52253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_DYNAMIC_DEPTHSCALE_0 1 /* just the header */
53fc1fbb2dc183f979d30b8abc8b235c3a8ff32839Stéphane Marchesin#define I915_DYNAMIC_DEPTHSCALE_1 2
54253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_DYNAMIC_IAB          3
55253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_DYNAMIC_BC_0         4 /* just the header */
56253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_DYNAMIC_BC_1         5
57fc1fbb2dc183f979d30b8abc8b235c3a8ff32839Stéphane Marchesin#define I915_DYNAMIC_BFO_0        6
58253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_DYNAMIC_BFO_1        7
59fc1fbb2dc183f979d30b8abc8b235c3a8ff32839Stéphane Marchesin#define I915_DYNAMIC_STP_0        8
60fc1fbb2dc183f979d30b8abc8b235c3a8ff32839Stéphane Marchesin#define I915_DYNAMIC_STP_1        9
61fc1fbb2dc183f979d30b8abc8b235c3a8ff32839Stéphane Marchesin#define I915_DYNAMIC_SC_ENA_0     10
62fc1fbb2dc183f979d30b8abc8b235c3a8ff32839Stéphane Marchesin#define I915_DYNAMIC_SC_RECT_0    11
63fc1fbb2dc183f979d30b8abc8b235c3a8ff32839Stéphane Marchesin#define I915_DYNAMIC_SC_RECT_1    12
64fc1fbb2dc183f979d30b8abc8b235c3a8ff32839Stéphane Marchesin#define I915_DYNAMIC_SC_RECT_2    13
65253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_MAX_DYNAMIC          14
66253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
67253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
68253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_IMMEDIATE_S0         0
69253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_IMMEDIATE_S1         1
70253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_IMMEDIATE_S2         2
71253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_IMMEDIATE_S3         3
72253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_IMMEDIATE_S4         4
73253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_IMMEDIATE_S5         5
74253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_IMMEDIATE_S6         6
75253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_IMMEDIATE_S7         7
76253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_MAX_IMMEDIATE        8
77253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
78253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/* These must mach the order of LI0_STATE_* bits, as they will be used
79253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * to generate hardware packets:
80253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
81fc1fbb2dc183f979d30b8abc8b235c3a8ff32839Stéphane Marchesin#define I915_CACHE_STATIC         0
82253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_CACHE_DYNAMIC        1 /* handled specially */
83253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_CACHE_SAMPLER        2
84253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_CACHE_MAP            3
85253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_CACHE_PROGRAM        4
86253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_CACHE_CONSTANTS      5
87253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_MAX_CACHE            6
88253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
89253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_MAX_CONSTANT  32
90253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
91253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
92253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/** See constant_flags[] below */
93253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_CONSTFLAG_USER 0x1f
94253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
95253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
96253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/**
97253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * Subclass of pipe_shader_state
98253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
99253066d716e3039522eeb7b072811cccd89b4a82José Fonsecastruct i915_fragment_shader
100253066d716e3039522eeb7b072811cccd89b4a82José Fonseca{
101253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct pipe_shader_state state;
102253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
103253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct tgsi_shader_info info;
104253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
1051a69b50b3b441ce8f7a00af3a7f02c37df50f6c3Stéphane Marchesin   struct draw_fragment_shader *draw_data;
1061a69b50b3b441ce8f7a00af3a7f02c37df50f6c3Stéphane Marchesin
1078e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin   uint *decl;
1088e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin   uint decl_len;
1098e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin
110253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   uint *program;
111253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   uint program_len;
112253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
113253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   /**
114253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * constants introduced during translation.
115253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * These are placed at the end of the constant buffer and grow toward
116253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * the beginning (eg: slot 31, 30 29, ...)
117253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * User-provided constants start at 0.
118253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * This allows both types of constants to co-exist (until there's too many)
119253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * and doesn't require regenerating/changing the fragment program to
120253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * shuffle constants around.
121253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    */
122253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   uint num_constants;
123253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   float constants[I915_MAX_CONSTANT][4];
124253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
125253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   /**
126253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * Status of each constant
127253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * if I915_CONSTFLAG_PARAM, the value must be taken from the corresponding
128253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * slot of the user's constant buffer. (set by pipe->set_constant_buffer())
129253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    * Else, the bitmask indicates which components are occupied by immediates.
130253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    */
131253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   ubyte constant_flags[I915_MAX_CONSTANT];
132abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
133abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin   /**
134abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    * The mapping between generics and hw texture coords.
135abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    * We need to share this between the vertex and fragment stages.
136abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    **/
137abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin   int generic_mapping[I915_TEX_UNITS];
138253066d716e3039522eeb7b072811cccd89b4a82José Fonseca};
139253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
140253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
141253066d716e3039522eeb7b072811cccd89b4a82José Fonsecastruct i915_cache_context;
142253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
143253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/* Use to calculate differences between state emitted to hardware and
144253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * current driver-calculated state.
145253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
146fc1fbb2dc183f979d30b8abc8b235c3a8ff32839Stéphane Marchesinstruct i915_state
147253066d716e3039522eeb7b072811cccd89b4a82José Fonseca{
148253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned immediate[I915_MAX_IMMEDIATE];
149253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned dynamic[I915_MAX_DYNAMIC];
150253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
151253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   /** number of constants passed in through a constant buffer */
152253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   uint num_user_constants[PIPE_SHADER_TYPES];
153253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
154253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   /* texture sampler state */
155253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned sampler[I915_TEX_UNITS][3];
156253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned sampler_enable_flags;
157253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned sampler_enable_nr;
15845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   boolean sampler_srgb[I915_TEX_UNITS];
15945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int srgb_const_offset;
160253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
161253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   /* texture image buffers */
162253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned texbuffer[I915_TEX_UNITS][2];
163253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
164253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   /** Describes the current hardware vertex layout */
165253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct vertex_info vertex_info;
1668e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger
167beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter   /* static state (dst/depth buffer state) */
168beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter   struct i915_winsys_buffer *cbuf_bo;
169beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter   unsigned cbuf_flags;
170beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter   struct i915_winsys_buffer *depth_bo;
171beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter   unsigned depth_flags;
172beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter   unsigned dst_buf_vars;
173f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter   uint32_t draw_offset;
174f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter   uint32_t draw_size;
17523d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin   uint32_t target_fixup_format;
176305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter   uint32_t fixup_swizzle;
177beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter
178253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned id;			/* track lost context events */
179253066d716e3039522eeb7b072811cccd89b4a82José Fonseca};
180253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
181253066d716e3039522eeb7b072811cccd89b4a82José Fonsecastruct i915_blend_state {
182253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned iab;
183253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned modes4;
184253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned LIS5;
185253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned LIS6;
186253066d716e3039522eeb7b072811cccd89b4a82José Fonseca};
187253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
188253066d716e3039522eeb7b072811cccd89b4a82José Fonsecastruct i915_depth_stencil_state {
189253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned stencil_modes4;
190253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned bfo[2];
191253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned stencil_LIS5;
192253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned depth_LIS6;
193253066d716e3039522eeb7b072811cccd89b4a82José Fonseca};
194253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
195253066d716e3039522eeb7b072811cccd89b4a82José Fonsecastruct i915_rasterizer_state {
1969c76ba04f845077d51912cc11970232cc9160294Stéphane Marchesin   struct pipe_rasterizer_state templ;
1979c76ba04f845077d51912cc11970232cc9160294Stéphane Marchesin
1985ad488908b39b8f2278a00c9d2cbce76dd925ad1Vinson Lee   unsigned light_twoside : 1;
199253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned st;
200253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   enum interp_mode color_interp;
201253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
202253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned LIS4;
203253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned LIS7;
204253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned sc[1];
205253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
206253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   union { float f; unsigned u; } ds[2];
207253066d716e3039522eeb7b072811cccd89b4a82José Fonseca};
208253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
209253066d716e3039522eeb7b072811cccd89b4a82José Fonsecastruct i915_sampler_state {
210a7534d8943d74e81299b2ee4edc462baac9d1331Stéphane Marchesin   struct pipe_sampler_state templ;
211253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned state[3];
212d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   unsigned minlod;
213d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   unsigned maxlod;
214253066d716e3039522eeb7b072811cccd89b4a82José Fonseca};
215253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
2168e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheideggerstruct i915_velems_state {
2178e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   unsigned count;
218e8983f70b41ea92a9527cb618db011b5dd136626Roland Scheidegger   struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
2198e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger};
2208e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger
221253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
222a95e694eaf3b40c86fbe8116fc3b5f1add365898Daniel Vetterstruct i915_context {
223e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   struct pipe_context base;
224e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz
225bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_winsys *iws;
226d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
227253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct draw_context *draw;
228253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
229253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   /* The most recent drawing state as set by the driver:
230253066d716e3039522eeb7b072811cccd89b4a82José Fonseca    */
231253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   const struct i915_blend_state           *blend;
232253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   const struct i915_sampler_state         *sampler[PIPE_MAX_SAMPLERS];
233cab2fed135bc1edf7b65ddca3236020638427061Brian Paul   struct pipe_sampler_state *vertex_samplers[PIPE_MAX_SAMPLERS];
234253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   const struct i915_depth_stencil_state   *depth_stencil;
235253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   const struct i915_rasterizer_state      *rasterizer;
236253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
237253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct i915_fragment_shader *fs;
238253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
239253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct pipe_blend_color blend_color;
240388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   struct pipe_stencil_ref stencil_ref;
241253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct pipe_clip_state clip;
242287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *constants[PIPE_SHADER_TYPES];
243253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct pipe_framebuffer_state framebuffer;
24405265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   struct pipe_poly_stipple poly_stipple;
245253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct pipe_scissor_state scissor;
2461f5285f99771243b636deb9ae0a17c54f818fac6michal   struct pipe_sampler_view *fragment_sampler_views[PIPE_MAX_SAMPLERS];
2478a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   struct pipe_sampler_view *vertex_sampler_views[PIPE_MAX_SAMPLERS];
248253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct pipe_viewport_state viewport;
2496d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu   struct pipe_index_buffer index_buffer;
250253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
251253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned dirty;
252253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
253cab2fed135bc1edf7b65ddca3236020638427061Brian Paul   struct pipe_resource *mapped_vs_tex[PIPE_MAX_SAMPLERS];
254cab2fed135bc1edf7b65ddca3236020638427061Brian Paul   struct i915_winsys_buffer* mapped_vs_tex_buffer[PIPE_MAX_SAMPLERS];
2558a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
256253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned num_samplers;
2571f5285f99771243b636deb9ae0a17c54f818fac6michal   unsigned num_fragment_sampler_views;
2588a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   unsigned num_vertex_samplers;
2598a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   unsigned num_vertex_sampler_views;
260253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
261bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_winsys_batchbuffer *batch;
262253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
263253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   /** Vertex buffer */
264bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_winsys_buffer *vbo;
265cb5e05d99c40d4f7ab1ecbb42a6390caf3966ba4Jakob Bornecrantz   size_t vbo_offset;
266cb5e05d99c40d4f7ab1ecbb42a6390caf3966ba4Jakob Bornecrantz   unsigned vbo_flushed;
267253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
268253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   struct i915_state current;
269253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   unsigned hardware_dirty;
270288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   unsigned immediate_dirty : I915_MAX_IMMEDIATE;
271288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   unsigned dynamic_dirty : I915_MAX_DYNAMIC;
272288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   unsigned static_dirty : 4;
273288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   unsigned flush_dirty : 2;
2747287964f944d7e2bcf409b758163ab75c61b0f8eJakob Bornecrantz
275342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   struct i915_winsys_buffer *validation_buffers[2 + 1 + I915_TEX_UNITS];
276342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   int num_validation_buffers;
277342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
2787287964f944d7e2bcf409b758163ab75c61b0f8eJakob Bornecrantz   struct util_slab_mempool transfer_pool;
2791a69b50b3b441ce8f7a00af3a7f02c37df50f6c3Stéphane Marchesin   struct util_slab_mempool texture_transfer_pool;
280f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter
281b97889f543085f516fc1c821c621790399d57fa5Stéphane Marchesin   /* state for tracking flushes */
282b97889f543085f516fc1c821c621790399d57fa5Stéphane Marchesin   int last_fired_vertices;
283b97889f543085f516fc1c821c621790399d57fa5Stéphane Marchesin   int fired_vertices;
284b97889f543085f516fc1c821c621790399d57fa5Stéphane Marchesin   int queued_vertices;
285e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesin
286f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   /** blitter/hw-clear */
287f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   struct blitter_context* blitter;
288f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter
289f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   /** State tracking needed by u_blitter for save/restore. */
290f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   void *saved_fs;
291f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   void (*saved_bind_fs_state)(struct pipe_context *pipe, void *shader);
292f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   void *saved_vs;
293f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   struct pipe_clip_state saved_clip;
294f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   struct i915_velems_state *saved_velems;
295f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   unsigned saved_nr_vertex_buffers;
296f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   struct pipe_vertex_buffer saved_vertex_buffers[PIPE_MAX_ATTRIBS];
297f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   unsigned saved_nr_samplers;
298f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   void *saved_samplers[PIPE_MAX_SAMPLERS];
299f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   void (*saved_bind_sampler_states)(struct pipe_context *pipe,
300f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter                                     unsigned num, void **sampler);
301f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   unsigned saved_nr_sampler_views;
302f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS];
303f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter   void (*saved_set_sampler_views)(struct pipe_context *pipe,
304f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter                                   unsigned num, struct pipe_sampler_view **views);
305253066d716e3039522eeb7b072811cccd89b4a82José Fonseca};
306253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
307253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/* A flag for each state_tracker state object:
308253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
309253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_VIEWPORT      0x1
310253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_RASTERIZER    0x2
311253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_FS            0x4
312253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_BLEND         0x8
313253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_CLIP          0x10
314253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_SCISSOR       0x20
315253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_STIPPLE       0x40
316253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_FRAMEBUFFER   0x80
317253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_ALPHA_TEST    0x100
318253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_DEPTH_STENCIL 0x200
319253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_SAMPLER       0x400
3201f5285f99771243b636deb9ae0a17c54f818fac6michal#define I915_NEW_SAMPLER_VIEW  0x800
3212e60aa511dd232f88697d1cc2091442caaef79b2Jakob Bornecrantz#define I915_NEW_VS_CONSTANTS  0x1000
3222e60aa511dd232f88697d1cc2091442caaef79b2Jakob Bornecrantz#define I915_NEW_FS_CONSTANTS  0x2000
3232e60aa511dd232f88697d1cc2091442caaef79b2Jakob Bornecrantz#define I915_NEW_GS_CONSTANTS  0x4000
3242e60aa511dd232f88697d1cc2091442caaef79b2Jakob Bornecrantz#define I915_NEW_VBO           0x8000
3252e60aa511dd232f88697d1cc2091442caaef79b2Jakob Bornecrantz#define I915_NEW_VS            0x10000
326253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
327253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
328253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/* Driver's internally generated state flags:
329253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
330253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_NEW_VERTEX_FORMAT    0x10000
331253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
332253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
333253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/* Dirty flags for hardware emit
334253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
335253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_HW_STATIC            (1<<I915_CACHE_STATIC)
336253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_HW_DYNAMIC           (1<<I915_CACHE_DYNAMIC)
337253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_HW_SAMPLER           (1<<I915_CACHE_SAMPLER)
338253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_HW_MAP               (1<<I915_CACHE_MAP)
339253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_HW_PROGRAM           (1<<I915_CACHE_PROGRAM)
340253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_HW_CONSTANTS         (1<<I915_CACHE_CONSTANTS)
341253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#define I915_HW_IMMEDIATE         (1<<(I915_MAX_CACHE+0))
342a185d439bdab24750d9c22e42a723f6baa23b730Brian Paul#define I915_HW_INVARIANT         (1<<(I915_MAX_CACHE+1))
343d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter#define I915_HW_FLUSH             (1<<(I915_MAX_CACHE+1))
344d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter
345d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter/* hw flush handling */
346d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter#define I915_FLUSH_CACHE		1
347d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter#define I915_PIPELINE_FLUSH		2
348d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter
349288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter/* split up static state */
350288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter#define I915_DST_BUF_COLOR              1
351288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter#define I915_DST_BUF_DEPTH              2
352288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter#define I915_DST_VARS                   4
353288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter#define I915_DST_RECT                   8
354288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter
355d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetterstatic INLINE
356d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vettervoid i915_set_flush_dirty(struct i915_context *i915, unsigned flush)
357d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter{
358d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter   i915->hardware_dirty |= I915_HW_FLUSH;
359d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter   i915->flush_dirty |= flush;
360d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter}
361253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
362253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
363253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/***********************************************************************
364253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * i915_prim_emit.c:
365253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
366253066d716e3039522eeb7b072811cccd89b4a82José Fonsecastruct draw_stage *i915_draw_render_stage( struct i915_context *i915 );
367253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
368253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
369253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/***********************************************************************
370253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * i915_prim_vbuf.c:
371253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
372253066d716e3039522eeb7b072811cccd89b4a82José Fonsecastruct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 );
373253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
374253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
375253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/***********************************************************************
3768a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin * i915_state.c:
3778a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin */
378b1d93d2aa8395608e77f1c538aa2234ced3dda75Stéphane Marchesinvoid i915_prepare_vertex_sampling(struct i915_context *i915);
3798a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesinvoid i915_cleanup_vertex_sampling(struct i915_context *i915);
3808a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
3818a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
3828a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
3838a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin/***********************************************************************
384253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * i915_state_emit.c:
385253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
386253066d716e3039522eeb7b072811cccd89b4a82José Fonsecavoid i915_emit_hardware_state(struct i915_context *i915 );
387253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
388253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
389253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
390253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/***********************************************************************
391253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * i915_clear.c:
392253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
3936dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlievoid i915_clear_blitter(struct pipe_context *pipe, unsigned buffers,
3946dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                        const union pipe_color_union *color,
3956358e6371b31671acbfa7c00336673f62ee928c5Daniel Vetter                        double depth, unsigned stencil);
3966dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlievoid i915_clear_render(struct pipe_context *pipe, unsigned buffers,
3976dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                       const union pipe_color_union *color,
3986358e6371b31671acbfa7c00336673f62ee928c5Daniel Vetter                       double depth, unsigned stencil);
3996dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlievoid i915_clear_emit(struct pipe_context *pipe, unsigned buffers,
4006dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                     const union pipe_color_union *color,
401fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter                     double depth, unsigned stencil,
402fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter                     unsigned destx, unsigned desty, unsigned width, unsigned height);
403253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
404253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
405253066d716e3039522eeb7b072811cccd89b4a82José Fonseca/***********************************************************************
406287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell *
407253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
408253066d716e3039522eeb7b072811cccd89b4a82José Fonsecavoid i915_init_state_functions( struct i915_context *i915 );
409f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vettervoid i915_init_fixup_state_functions( struct i915_context *i915 );
410253066d716e3039522eeb7b072811cccd89b4a82José Fonsecavoid i915_init_flush_functions( struct i915_context *i915 );
411253066d716e3039522eeb7b072811cccd89b4a82José Fonsecavoid i915_init_string_functions( struct i915_context *i915 );
412253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
413253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
4147f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell/************************************************************************
4157f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell * i915_context.c
4167f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell */
4177f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwellstruct pipe_context *i915_create_context(struct pipe_screen *screen,
4187f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell					 void *priv);
419253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
420253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
421b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell/***********************************************************************
422253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * Inline conversion functions.  These are better-typed than the
423253066d716e3039522eeb7b072811cccd89b4a82José Fonseca * macros used previously:
424253066d716e3039522eeb7b072811cccd89b4a82José Fonseca */
425253066d716e3039522eeb7b072811cccd89b4a82José Fonsecastatic INLINE struct i915_context *
426253066d716e3039522eeb7b072811cccd89b4a82José Fonsecai915_context( struct pipe_context *pipe )
427253066d716e3039522eeb7b072811cccd89b4a82José Fonseca{
428253066d716e3039522eeb7b072811cccd89b4a82José Fonseca   return (struct i915_context *)pipe;
429253066d716e3039522eeb7b072811cccd89b4a82José Fonseca}
430253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
431253066d716e3039522eeb7b072811cccd89b4a82José Fonseca
432253066d716e3039522eeb7b072811cccd89b4a82José Fonseca#endif
433