i915_context.h revision 23d4a0569dcb70bdfd748bf7e1f5102289bfad6b
1 /************************************************************************** 2 * 3 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 4 * All Rights Reserved. 5 * 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: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 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 TUNGSTEN GRAPHICS 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. 25 * 26 **************************************************************************/ 27 28#ifndef I915_CONTEXT_H 29#define I915_CONTEXT_H 30 31 32#include "pipe/p_context.h" 33#include "pipe/p_defines.h" 34#include "pipe/p_state.h" 35 36#include "draw/draw_vertex.h" 37 38#include "tgsi/tgsi_scan.h" 39 40#include "util/u_slab.h" 41#include "util/u_blitter.h" 42 43 44struct i915_winsys; 45struct i915_winsys_buffer; 46struct i915_winsys_batchbuffer; 47 48 49#define I915_TEX_UNITS 8 50 51#define I915_DYNAMIC_MODES4 0 52#define I915_DYNAMIC_DEPTHSCALE_0 1 /* just the header */ 53#define I915_DYNAMIC_DEPTHSCALE_1 2 54#define I915_DYNAMIC_IAB 3 55#define I915_DYNAMIC_BC_0 4 /* just the header */ 56#define I915_DYNAMIC_BC_1 5 57#define I915_DYNAMIC_BFO_0 6 58#define I915_DYNAMIC_BFO_1 7 59#define I915_DYNAMIC_STP_0 8 60#define I915_DYNAMIC_STP_1 9 61#define I915_DYNAMIC_SC_ENA_0 10 62#define I915_DYNAMIC_SC_RECT_0 11 63#define I915_DYNAMIC_SC_RECT_1 12 64#define I915_DYNAMIC_SC_RECT_2 13 65#define I915_MAX_DYNAMIC 14 66 67 68#define I915_IMMEDIATE_S0 0 69#define I915_IMMEDIATE_S1 1 70#define I915_IMMEDIATE_S2 2 71#define I915_IMMEDIATE_S3 3 72#define I915_IMMEDIATE_S4 4 73#define I915_IMMEDIATE_S5 5 74#define I915_IMMEDIATE_S6 6 75#define I915_IMMEDIATE_S7 7 76#define I915_MAX_IMMEDIATE 8 77 78/* These must mach the order of LI0_STATE_* bits, as they will be used 79 * to generate hardware packets: 80 */ 81#define I915_CACHE_STATIC 0 82#define I915_CACHE_DYNAMIC 1 /* handled specially */ 83#define I915_CACHE_SAMPLER 2 84#define I915_CACHE_MAP 3 85#define I915_CACHE_PROGRAM 4 86#define I915_CACHE_CONSTANTS 5 87#define I915_MAX_CACHE 6 88 89#define I915_MAX_CONSTANT 32 90 91 92/** See constant_flags[] below */ 93#define I915_CONSTFLAG_USER 0x1f 94 95 96/** 97 * Subclass of pipe_shader_state 98 */ 99struct i915_fragment_shader 100{ 101 struct pipe_shader_state state; 102 103 struct tgsi_shader_info info; 104 105 struct draw_fragment_shader *draw_data; 106 107 uint *program; 108 uint program_len; 109 110 /** 111 * constants introduced during translation. 112 * These are placed at the end of the constant buffer and grow toward 113 * the beginning (eg: slot 31, 30 29, ...) 114 * User-provided constants start at 0. 115 * This allows both types of constants to co-exist (until there's too many) 116 * and doesn't require regenerating/changing the fragment program to 117 * shuffle constants around. 118 */ 119 uint num_constants; 120 float constants[I915_MAX_CONSTANT][4]; 121 122 /** 123 * Status of each constant 124 * if I915_CONSTFLAG_PARAM, the value must be taken from the corresponding 125 * slot of the user's constant buffer. (set by pipe->set_constant_buffer()) 126 * Else, the bitmask indicates which components are occupied by immediates. 127 */ 128 ubyte constant_flags[I915_MAX_CONSTANT]; 129 130 /** 131 * The mapping between generics and hw texture coords. 132 * We need to share this between the vertex and fragment stages. 133 **/ 134 int generic_mapping[I915_TEX_UNITS]; 135}; 136 137 138struct i915_cache_context; 139 140/* Use to calculate differences between state emitted to hardware and 141 * current driver-calculated state. 142 */ 143struct i915_state 144{ 145 unsigned immediate[I915_MAX_IMMEDIATE]; 146 unsigned dynamic[I915_MAX_DYNAMIC]; 147 148 /** number of constants passed in through a constant buffer */ 149 uint num_user_constants[PIPE_SHADER_TYPES]; 150 151 /* texture sampler state */ 152 unsigned sampler[I915_TEX_UNITS][3]; 153 unsigned sampler_enable_flags; 154 unsigned sampler_enable_nr; 155 156 /* texture image buffers */ 157 unsigned texbuffer[I915_TEX_UNITS][2]; 158 159 /** Describes the current hardware vertex layout */ 160 struct vertex_info vertex_info; 161 162 /* static state (dst/depth buffer state) */ 163 struct i915_winsys_buffer *cbuf_bo; 164 unsigned cbuf_flags; 165 struct i915_winsys_buffer *depth_bo; 166 unsigned depth_flags; 167 unsigned dst_buf_vars; 168 uint32_t draw_offset; 169 uint32_t draw_size; 170 uint32_t target_fixup_format; 171 uint32_t fixup_swizzle; 172 173 unsigned id; /* track lost context events */ 174}; 175 176struct i915_blend_state { 177 unsigned iab; 178 unsigned modes4; 179 unsigned LIS5; 180 unsigned LIS6; 181}; 182 183struct i915_depth_stencil_state { 184 unsigned stencil_modes4; 185 unsigned bfo[2]; 186 unsigned stencil_LIS5; 187 unsigned depth_LIS6; 188}; 189 190struct i915_rasterizer_state { 191 struct pipe_rasterizer_state templ; 192 193 unsigned light_twoside : 1; 194 unsigned st; 195 enum interp_mode color_interp; 196 197 unsigned LIS4; 198 unsigned LIS7; 199 unsigned sc[1]; 200 201 union { float f; unsigned u; } ds[2]; 202}; 203 204struct i915_sampler_state { 205 struct pipe_sampler_state templ; 206 unsigned state[3]; 207 unsigned minlod; 208 unsigned maxlod; 209}; 210 211struct i915_velems_state { 212 unsigned count; 213 struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS]; 214}; 215 216 217struct i915_context { 218 struct pipe_context base; 219 220 struct i915_winsys *iws; 221 222 struct draw_context *draw; 223 224 /* The most recent drawing state as set by the driver: 225 */ 226 const struct i915_blend_state *blend; 227 const struct i915_sampler_state *sampler[PIPE_MAX_SAMPLERS]; 228 struct pipe_sampler_state *vertex_samplers[PIPE_MAX_VERTEX_SAMPLERS]; 229 const struct i915_depth_stencil_state *depth_stencil; 230 const struct i915_rasterizer_state *rasterizer; 231 232 struct i915_fragment_shader *fs; 233 234 struct pipe_blend_color blend_color; 235 struct pipe_stencil_ref stencil_ref; 236 struct pipe_clip_state clip; 237 struct pipe_resource *constants[PIPE_SHADER_TYPES]; 238 struct pipe_framebuffer_state framebuffer; 239 struct pipe_poly_stipple poly_stipple; 240 struct pipe_scissor_state scissor; 241 struct pipe_sampler_view *fragment_sampler_views[PIPE_MAX_SAMPLERS]; 242 struct pipe_sampler_view *vertex_sampler_views[PIPE_MAX_SAMPLERS]; 243 struct pipe_viewport_state viewport; 244 struct pipe_index_buffer index_buffer; 245 246 unsigned dirty; 247 248 struct pipe_resource *mapped_vs_tex[PIPE_MAX_VERTEX_SAMPLERS]; 249 struct i915_winsys_buffer* mapped_vs_tex_buffer[PIPE_MAX_VERTEX_SAMPLERS]; 250 251 unsigned num_samplers; 252 unsigned num_fragment_sampler_views; 253 unsigned num_vertex_samplers; 254 unsigned num_vertex_sampler_views; 255 256 struct i915_winsys_batchbuffer *batch; 257 258 /** Vertex buffer */ 259 struct i915_winsys_buffer *vbo; 260 size_t vbo_offset; 261 unsigned vbo_flushed; 262 263 struct i915_state current; 264 unsigned hardware_dirty; 265 unsigned immediate_dirty : I915_MAX_IMMEDIATE; 266 unsigned dynamic_dirty : I915_MAX_DYNAMIC; 267 unsigned static_dirty : 4; 268 unsigned flush_dirty : 2; 269 270 struct i915_winsys_buffer *validation_buffers[2 + 1 + I915_TEX_UNITS]; 271 int num_validation_buffers; 272 273 struct util_slab_mempool transfer_pool; 274 struct util_slab_mempool texture_transfer_pool; 275 276 /* state for tracking flushes */ 277 int last_fired_vertices; 278 int fired_vertices; 279 int queued_vertices; 280 281 /** blitter/hw-clear */ 282 struct blitter_context* blitter; 283 284 /** State tracking needed by u_blitter for save/restore. */ 285 void *saved_fs; 286 void (*saved_bind_fs_state)(struct pipe_context *pipe, void *shader); 287 void *saved_vs; 288 struct pipe_clip_state saved_clip; 289 struct i915_velems_state *saved_velems; 290 unsigned saved_nr_vertex_buffers; 291 struct pipe_vertex_buffer saved_vertex_buffers[PIPE_MAX_ATTRIBS]; 292 unsigned saved_nr_samplers; 293 void *saved_samplers[PIPE_MAX_SAMPLERS]; 294 void (*saved_bind_sampler_states)(struct pipe_context *pipe, 295 unsigned num, void **sampler); 296 unsigned saved_nr_sampler_views; 297 struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS]; 298 void (*saved_set_sampler_views)(struct pipe_context *pipe, 299 unsigned num, struct pipe_sampler_view **views); 300}; 301 302/* A flag for each state_tracker state object: 303 */ 304#define I915_NEW_VIEWPORT 0x1 305#define I915_NEW_RASTERIZER 0x2 306#define I915_NEW_FS 0x4 307#define I915_NEW_BLEND 0x8 308#define I915_NEW_CLIP 0x10 309#define I915_NEW_SCISSOR 0x20 310#define I915_NEW_STIPPLE 0x40 311#define I915_NEW_FRAMEBUFFER 0x80 312#define I915_NEW_ALPHA_TEST 0x100 313#define I915_NEW_DEPTH_STENCIL 0x200 314#define I915_NEW_SAMPLER 0x400 315#define I915_NEW_SAMPLER_VIEW 0x800 316#define I915_NEW_VS_CONSTANTS 0x1000 317#define I915_NEW_FS_CONSTANTS 0x2000 318#define I915_NEW_GS_CONSTANTS 0x4000 319#define I915_NEW_VBO 0x8000 320#define I915_NEW_VS 0x10000 321 322 323/* Driver's internally generated state flags: 324 */ 325#define I915_NEW_VERTEX_FORMAT 0x10000 326 327 328/* Dirty flags for hardware emit 329 */ 330#define I915_HW_STATIC (1<<I915_CACHE_STATIC) 331#define I915_HW_DYNAMIC (1<<I915_CACHE_DYNAMIC) 332#define I915_HW_SAMPLER (1<<I915_CACHE_SAMPLER) 333#define I915_HW_MAP (1<<I915_CACHE_MAP) 334#define I915_HW_PROGRAM (1<<I915_CACHE_PROGRAM) 335#define I915_HW_CONSTANTS (1<<I915_CACHE_CONSTANTS) 336#define I915_HW_IMMEDIATE (1<<(I915_MAX_CACHE+0)) 337#define I915_HW_INVARIANT (1<<(I915_MAX_CACHE+1)) 338#define I915_HW_FLUSH (1<<(I915_MAX_CACHE+1)) 339 340/* hw flush handling */ 341#define I915_FLUSH_CACHE 1 342#define I915_PIPELINE_FLUSH 2 343 344/* split up static state */ 345#define I915_DST_BUF_COLOR 1 346#define I915_DST_BUF_DEPTH 2 347#define I915_DST_VARS 4 348#define I915_DST_RECT 8 349 350static INLINE 351void i915_set_flush_dirty(struct i915_context *i915, unsigned flush) 352{ 353 i915->hardware_dirty |= I915_HW_FLUSH; 354 i915->flush_dirty |= flush; 355} 356 357 358/*********************************************************************** 359 * i915_prim_emit.c: 360 */ 361struct draw_stage *i915_draw_render_stage( struct i915_context *i915 ); 362 363 364/*********************************************************************** 365 * i915_prim_vbuf.c: 366 */ 367struct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 ); 368 369 370/*********************************************************************** 371 * i915_state.c: 372 */ 373void i915_prepare_vertex_sampling(struct i915_context *i915); 374void i915_cleanup_vertex_sampling(struct i915_context *i915); 375 376 377 378/*********************************************************************** 379 * i915_state_emit.c: 380 */ 381void i915_emit_hardware_state(struct i915_context *i915 ); 382 383 384 385/*********************************************************************** 386 * i915_clear.c: 387 */ 388void i915_clear_blitter(struct pipe_context *pipe, unsigned buffers, 389 const union pipe_color_union *color, 390 double depth, unsigned stencil); 391void i915_clear_render(struct pipe_context *pipe, unsigned buffers, 392 const union pipe_color_union *color, 393 double depth, unsigned stencil); 394void i915_clear_emit(struct pipe_context *pipe, unsigned buffers, 395 const union pipe_color_union *color, 396 double depth, unsigned stencil, 397 unsigned destx, unsigned desty, unsigned width, unsigned height); 398 399 400/*********************************************************************** 401 * 402 */ 403void i915_init_state_functions( struct i915_context *i915 ); 404void i915_init_fixup_state_functions( struct i915_context *i915 ); 405void i915_init_flush_functions( struct i915_context *i915 ); 406void i915_init_string_functions( struct i915_context *i915 ); 407 408 409/************************************************************************ 410 * i915_context.c 411 */ 412struct pipe_context *i915_create_context(struct pipe_screen *screen, 413 void *priv); 414 415 416/*********************************************************************** 417 * Inline conversion functions. These are better-typed than the 418 * macros used previously: 419 */ 420static INLINE struct i915_context * 421i915_context( struct pipe_context *pipe ) 422{ 423 return (struct i915_context *)pipe; 424} 425 426 427#endif 428