1
/**************************************************************************
3
* Copyright 2003 VMware, Inc.
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the
8
* "Software"), to deal in the Software without restriction, including
9
* without limitation the rights to use, copy, modify, merge, publish,
10
* distribute, sub license, and/or sell copies of the Software, and to
11
* permit persons to whom the Software is furnished to do so, subject to
12
* the following conditions:
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial portions
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
**************************************************************************/
28
#ifndef I915_CONTEXT_H
29
#define I915_CONTEXT_H
31
#include "pipe/p_context.h"
32
#include "pipe/p_defines.h"
33
#include "pipe/p_state.h"
35
#include "draw/draw_vertex.h"
37
#include "tgsi/tgsi_scan.h"
40
#include "util/slab.h"
41
#include "util/u_blitter.h"
45
struct i915_winsys_buffer;
46
struct i915_winsys_batchbuffer;
48
#define I915_TEX_UNITS 8
50
#define I915_DYNAMIC_MODES4 0
51
#define I915_DYNAMIC_DEPTHSCALE_0 1 /* just the header */
52
#define I915_DYNAMIC_DEPTHSCALE_1 2
53
#define I915_DYNAMIC_IAB 3
54
#define I915_DYNAMIC_BC_0 4 /* just the header */
55
#define I915_DYNAMIC_BC_1 5
56
#define I915_DYNAMIC_BFO_0 6
57
#define I915_DYNAMIC_BFO_1 7
58
#define I915_DYNAMIC_STP_0 8
59
#define I915_DYNAMIC_STP_1 9
60
#define I915_DYNAMIC_SC_ENA_0 10
61
#define I915_DYNAMIC_SC_RECT_0 11
62
#define I915_DYNAMIC_SC_RECT_1 12
63
#define I915_DYNAMIC_SC_RECT_2 13
64
#define I915_MAX_DYNAMIC 14
66
#define I915_IMMEDIATE_S0 0
67
#define I915_IMMEDIATE_S1 1
68
#define I915_IMMEDIATE_S2 2
69
#define I915_IMMEDIATE_S3 3
70
#define I915_IMMEDIATE_S4 4
71
#define I915_IMMEDIATE_S5 5
72
#define I915_IMMEDIATE_S6 6
73
#define I915_IMMEDIATE_S7 7
74
#define I915_MAX_IMMEDIATE 8
76
/* These must mach the order of LI0_STATE_* bits, as they will be used
77
* to generate hardware packets:
79
#define I915_CACHE_STATIC 0
80
#define I915_CACHE_DYNAMIC 1 /* handled specially */
81
#define I915_CACHE_SAMPLER 2
82
#define I915_CACHE_MAP 3
83
#define I915_CACHE_PROGRAM 4
84
#define I915_CACHE_CONSTANTS 5
85
#define I915_MAX_CACHE 6
87
#define I915_MAX_CONSTANT 32
89
/** See constant_flags[] below */
90
#define I915_CONSTFLAG_USER 0x1f
93
* Subclass of pipe_shader_state
95
struct i915_fragment_shader {
96
struct pipe_shader_state state;
98
struct tgsi_shader_info info;
100
struct draw_fragment_shader *draw_data;
103
uint32_t program_len;
106
* constants introduced during translation.
107
* These are placed at the end of the constant buffer and grow toward
108
* the beginning (eg: slot 31, 30 29, ...)
109
* User-provided constants start at 0.
110
* This allows both types of constants to co-exist (until there's too many)
111
* and doesn't require regenerating/changing the fragment program to
112
* shuffle constants around.
114
uint32_t num_constants;
115
float constants[I915_MAX_CONSTANT][4];
118
* Status of each constant
119
* if I915_CONSTFLAG_PARAM, the value must be taken from the corresponding
120
* slot of the user's constant buffer. (set by pipe->set_constant_buffer())
121
* Else, the bitmask indicates which components are occupied by immediates.
123
ubyte constant_flags[I915_MAX_CONSTANT];
126
* The mapping between TGSI inputs and hw texture coords.
127
* We need to share this between the vertex and fragment stages.
130
enum tgsi_semantic semantic;
132
} texcoords[I915_TEX_UNITS];
137
struct i915_cache_context;
139
/* Use to calculate differences between state emitted to hardware and
140
* current driver-calculated state.
143
unsigned immediate[I915_MAX_IMMEDIATE];
144
unsigned dynamic[I915_MAX_DYNAMIC];
146
/** number of constants passed in through a constant buffer */
147
uint32_t num_user_constants[PIPE_SHADER_TYPES];
149
/* texture sampler state */
150
unsigned sampler[I915_TEX_UNITS][3];
151
unsigned sampler_enable_flags;
152
unsigned sampler_enable_nr;
154
/* texture image buffers */
155
unsigned texbuffer[I915_TEX_UNITS][3];
157
/** Describes the current hardware vertex layout */
158
struct vertex_info vertex_info;
160
/* static state (dst/depth buffer state) */
161
struct i915_winsys_buffer *cbuf_bo;
163
struct i915_winsys_buffer *depth_bo;
164
unsigned depth_flags;
165
unsigned dst_buf_vars;
166
uint32_t draw_offset;
169
/* Reswizzle for OC writes in PIXEL_SHADER_PROGRAM, or 0 if unnecessary. */
170
uint32_t fixup_swizzle;
171
/* Mapping from color buffer dst channels in HW to gallium API src channels.
173
uint8_t color_swizzle[4];
175
unsigned id; /* track lost context events */
178
struct i915_blend_state {
180
unsigned iab_alpha_in_g;
181
unsigned iab_alpha_is_x;
187
unsigned LIS6_alpha_in_g;
188
unsigned LIS6_alpha_is_x;
191
struct i915_depth_stencil_state {
192
unsigned stencil_modes4_cw;
193
unsigned stencil_modes4_ccw;
196
unsigned stencil_LIS5_cw;
197
unsigned stencil_LIS5_ccw;
201
struct i915_rasterizer_state {
202
struct pipe_rasterizer_state templ;
204
unsigned light_twoside : 1;
218
struct i915_sampler_state {
219
struct pipe_sampler_state templ;
225
struct i915_surface {
226
struct pipe_surface templ;
227
uint32_t buf_info; /* _3DSTATE_BUF_INFO_CMD flags */
229
/* PIXEL_SHADER_PROGRAM swizzle for OC buffer to handle the cbuf format (or 0
232
/* cbuf swizzle from dst r/g/b/a channels in memory to channels of gallium
234
uint8_t color_swizzle[4];
240
struct i915_velems_state {
242
struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
245
struct i915_context {
246
struct pipe_context base;
248
struct i915_winsys *iws;
250
struct draw_context *draw;
252
/* The most recent drawing state as set by the driver:
254
const struct i915_blend_state *blend;
255
const struct i915_sampler_state *fragment_sampler[PIPE_MAX_SAMPLERS];
256
struct pipe_sampler_state *vertex_samplers[PIPE_MAX_SAMPLERS];
257
const struct i915_depth_stencil_state *depth_stencil;
258
const struct i915_rasterizer_state *rasterizer;
260
struct i915_fragment_shader *fs;
264
struct i915_velems_state *velems;
265
unsigned nr_vertex_buffers;
266
struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
268
struct pipe_blend_color blend_color;
269
struct pipe_stencil_ref stencil_ref;
270
struct pipe_clip_state clip;
271
struct pipe_resource *constants[PIPE_SHADER_TYPES];
272
struct pipe_framebuffer_state framebuffer;
273
struct pipe_poly_stipple poly_stipple;
274
struct pipe_scissor_state scissor;
275
struct pipe_sampler_view *fragment_sampler_views[PIPE_MAX_SAMPLERS];
276
struct pipe_viewport_state viewport;
280
unsigned num_samplers;
281
unsigned num_fragment_sampler_views;
283
struct i915_winsys_batchbuffer *batch;
286
struct i915_winsys_buffer *vbo;
288
unsigned vbo_flushed;
290
struct i915_state current;
291
unsigned hardware_dirty;
292
unsigned immediate_dirty : I915_MAX_IMMEDIATE;
293
unsigned dynamic_dirty : I915_MAX_DYNAMIC;
294
unsigned static_dirty : 4;
295
unsigned flush_dirty : 2;
297
struct i915_winsys_buffer *validation_buffers[2 + 1 + I915_TEX_UNITS];
298
int num_validation_buffers;
300
struct slab_mempool transfer_pool;
301
struct slab_mempool texture_transfer_pool;
303
/* state for tracking flushes */
304
int last_fired_vertices;
308
bool no_log_program_errors;
310
/** blitter/hw-clear */
311
struct blitter_context *blitter;
313
struct util_debug_callback debug;
316
/* A flag for each frontend state object:
318
#define I915_NEW_VIEWPORT 0x1
319
#define I915_NEW_RASTERIZER 0x2
320
#define I915_NEW_FS 0x4
321
#define I915_NEW_BLEND 0x8
322
#define I915_NEW_CLIP 0x10
323
#define I915_NEW_SCISSOR 0x20
324
#define I915_NEW_STIPPLE 0x40
325
#define I915_NEW_FRAMEBUFFER 0x80
326
#define I915_NEW_ALPHA_TEST 0x100
327
#define I915_NEW_DEPTH_STENCIL 0x200
328
#define I915_NEW_SAMPLER 0x400
329
#define I915_NEW_SAMPLER_VIEW 0x800
330
#define I915_NEW_VS_CONSTANTS 0x1000
331
#define I915_NEW_FS_CONSTANTS 0x2000
332
#define I915_NEW_GS_CONSTANTS 0x4000
333
#define I915_NEW_VBO 0x8000
334
#define I915_NEW_VS 0x10000
335
#define I915_NEW_COLOR_SWIZZLE 0x20000
337
/* Driver's internally generated state flags:
339
#define I915_NEW_VERTEX_FORMAT 0x10000
341
/* Dirty flags for hardware emit
343
#define I915_HW_STATIC (1 << I915_CACHE_STATIC)
344
#define I915_HW_DYNAMIC (1 << I915_CACHE_DYNAMIC)
345
#define I915_HW_SAMPLER (1 << I915_CACHE_SAMPLER)
346
#define I915_HW_MAP (1 << I915_CACHE_MAP)
347
#define I915_HW_PROGRAM (1 << I915_CACHE_PROGRAM)
348
#define I915_HW_CONSTANTS (1 << I915_CACHE_CONSTANTS)
349
#define I915_HW_IMMEDIATE (1 << (I915_MAX_CACHE + 0))
350
#define I915_HW_INVARIANT (1 << (I915_MAX_CACHE + 1))
351
#define I915_HW_FLUSH (1 << (I915_MAX_CACHE + 1))
353
/* hw flush handling */
354
#define I915_FLUSH_CACHE 1
355
#define I915_PIPELINE_FLUSH 2
357
/* split up static state */
358
#define I915_DST_BUF_COLOR 1
359
#define I915_DST_BUF_DEPTH 2
360
#define I915_DST_VARS 4
361
#define I915_DST_RECT 8
364
i915_set_flush_dirty(struct i915_context *i915, unsigned flush)
366
i915->hardware_dirty |= I915_HW_FLUSH;
367
i915->flush_dirty |= flush;
370
static inline uint32_t
371
i915_stencil_ccw(struct i915_context *i915)
373
/* If we're doing two sided stencil, then front_ccw means we need to reverse
374
* the state for the sides.
376
return i915->rasterizer->templ.front_ccw &&
377
(i915->depth_stencil->bfo_cw[0] & BFO_STENCIL_TWO_SIDE);
379
/***********************************************************************
382
struct draw_stage *i915_draw_render_stage(struct i915_context *i915);
384
/***********************************************************************
387
struct draw_stage *i915_draw_vbuf_stage(struct i915_context *i915);
389
/***********************************************************************
392
void i915_emit_hardware_state(struct i915_context *i915);
394
/***********************************************************************
397
void i915_clear_blitter(struct pipe_context *pipe, unsigned buffers,
398
const struct pipe_scissor_state *scissor_state,
399
const union pipe_color_union *color, double depth,
401
void i915_clear_render(struct pipe_context *pipe, unsigned buffers,
402
const struct pipe_scissor_state *scissor_state,
403
const union pipe_color_union *color, double depth,
405
void i915_clear_emit(struct pipe_context *pipe, unsigned buffers,
406
const union pipe_color_union *color, double depth,
407
unsigned stencil, unsigned destx, unsigned desty,
408
unsigned width, unsigned height);
410
/***********************************************************************
413
void i915_init_state_functions(struct i915_context *i915);
414
void i915_init_flush_functions(struct i915_context *i915);
415
void i915_init_string_functions(struct i915_context *i915);
417
/************************************************************************
420
struct pipe_context *i915_create_context(struct pipe_screen *screen, void *priv,
423
/***********************************************************************
424
* Inline conversion functions. These are better-typed than the
425
* macros used previously:
427
static inline struct i915_context *
428
i915_context(struct pipe_context *pipe)
430
return (struct i915_context *)pipe;
433
static inline struct i915_surface *
434
i915_surface(struct pipe_surface *pipe)
436
return (struct i915_surface *)pipe;