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 44 struct i915_winsys; 45 struct i915_winsys_buffer; 46 struct 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 */ 99 struct 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 *decl; 108 uint decl_len; 109 110 uint *program; 111 uint program_len; 112 113 /** 114 * constants introduced during translation. 115 * These are placed at the end of the constant buffer and grow toward 116 * the beginning (eg: slot 31, 30 29, ...) 117 * User-provided constants start at 0. 118 * This allows both types of constants to co-exist (until there's too many) 119 * and doesn't require regenerating/changing the fragment program to 120 * shuffle constants around. 121 */ 122 uint num_constants; 123 float constants[I915_MAX_CONSTANT][4]; 124 125 /** 126 * Status of each constant 127 * if I915_CONSTFLAG_PARAM, the value must be taken from the corresponding 128 * slot of the user's constant buffer. (set by pipe->set_constant_buffer()) 129 * Else, the bitmask indicates which components are occupied by immediates. 130 */ 131 ubyte constant_flags[I915_MAX_CONSTANT]; 132 133 /** 134 * The mapping between generics and hw texture coords. 135 * We need to share this between the vertex and fragment stages. 136 **/ 137 int generic_mapping[I915_TEX_UNITS]; 138 }; 139 140 141 struct i915_cache_context; 142 143 /* Use to calculate differences between state emitted to hardware and 144 * current driver-calculated state. 145 */ 146 struct i915_state 147 { 148 unsigned immediate[I915_MAX_IMMEDIATE]; 149 unsigned dynamic[I915_MAX_DYNAMIC]; 150 151 /** number of constants passed in through a constant buffer */ 152 uint num_user_constants[PIPE_SHADER_TYPES]; 153 154 /* texture sampler state */ 155 unsigned sampler[I915_TEX_UNITS][3]; 156 unsigned sampler_enable_flags; 157 unsigned sampler_enable_nr; 158 boolean sampler_srgb[I915_TEX_UNITS]; 159 int srgb_const_offset; 160 161 /* texture image buffers */ 162 unsigned texbuffer[I915_TEX_UNITS][2]; 163 164 /** Describes the current hardware vertex layout */ 165 struct vertex_info vertex_info; 166 167 /* static state (dst/depth buffer state) */ 168 struct i915_winsys_buffer *cbuf_bo; 169 unsigned cbuf_flags; 170 struct i915_winsys_buffer *depth_bo; 171 unsigned depth_flags; 172 unsigned dst_buf_vars; 173 uint32_t draw_offset; 174 uint32_t draw_size; 175 uint32_t target_fixup_format; 176 uint32_t fixup_swizzle; 177 178 unsigned id; /* track lost context events */ 179 }; 180 181 struct i915_blend_state { 182 unsigned iab; 183 unsigned modes4; 184 unsigned LIS5; 185 unsigned LIS6; 186 }; 187 188 struct i915_depth_stencil_state { 189 unsigned stencil_modes4; 190 unsigned bfo[2]; 191 unsigned stencil_LIS5; 192 unsigned depth_LIS6; 193 }; 194 195 struct i915_rasterizer_state { 196 struct pipe_rasterizer_state templ; 197 198 unsigned light_twoside : 1; 199 unsigned st; 200 enum interp_mode color_interp; 201 202 unsigned LIS4; 203 unsigned LIS7; 204 unsigned sc[1]; 205 206 union { float f; unsigned u; } ds[2]; 207 }; 208 209 struct i915_sampler_state { 210 struct pipe_sampler_state templ; 211 unsigned state[3]; 212 unsigned minlod; 213 unsigned maxlod; 214 }; 215 216 struct i915_velems_state { 217 unsigned count; 218 struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS]; 219 }; 220 221 222 struct i915_context { 223 struct pipe_context base; 224 225 struct i915_winsys *iws; 226 227 struct draw_context *draw; 228 229 /* The most recent drawing state as set by the driver: 230 */ 231 const struct i915_blend_state *blend; 232 const struct i915_sampler_state *sampler[PIPE_MAX_SAMPLERS]; 233 struct pipe_sampler_state *vertex_samplers[PIPE_MAX_SAMPLERS]; 234 const struct i915_depth_stencil_state *depth_stencil; 235 const struct i915_rasterizer_state *rasterizer; 236 237 struct i915_fragment_shader *fs; 238 239 struct pipe_blend_color blend_color; 240 struct pipe_stencil_ref stencil_ref; 241 struct pipe_clip_state clip; 242 struct pipe_resource *constants[PIPE_SHADER_TYPES]; 243 struct pipe_framebuffer_state framebuffer; 244 struct pipe_poly_stipple poly_stipple; 245 struct pipe_scissor_state scissor; 246 struct pipe_sampler_view *fragment_sampler_views[PIPE_MAX_SAMPLERS]; 247 struct pipe_sampler_view *vertex_sampler_views[PIPE_MAX_SAMPLERS]; 248 struct pipe_viewport_state viewport; 249 struct pipe_index_buffer index_buffer; 250 251 unsigned dirty; 252 253 struct pipe_resource *mapped_vs_tex[PIPE_MAX_SAMPLERS]; 254 struct i915_winsys_buffer* mapped_vs_tex_buffer[PIPE_MAX_SAMPLERS]; 255 256 unsigned num_samplers; 257 unsigned num_fragment_sampler_views; 258 unsigned num_vertex_samplers; 259 unsigned num_vertex_sampler_views; 260 261 struct i915_winsys_batchbuffer *batch; 262 263 /** Vertex buffer */ 264 struct i915_winsys_buffer *vbo; 265 size_t vbo_offset; 266 unsigned vbo_flushed; 267 268 struct i915_state current; 269 unsigned hardware_dirty; 270 unsigned immediate_dirty : I915_MAX_IMMEDIATE; 271 unsigned dynamic_dirty : I915_MAX_DYNAMIC; 272 unsigned static_dirty : 4; 273 unsigned flush_dirty : 2; 274 275 struct i915_winsys_buffer *validation_buffers[2 + 1 + I915_TEX_UNITS]; 276 int num_validation_buffers; 277 278 struct util_slab_mempool transfer_pool; 279 struct util_slab_mempool texture_transfer_pool; 280 281 /* state for tracking flushes */ 282 int last_fired_vertices; 283 int fired_vertices; 284 int queued_vertices; 285 286 /** blitter/hw-clear */ 287 struct blitter_context* blitter; 288 289 /** State tracking needed by u_blitter for save/restore. */ 290 void *saved_fs; 291 void (*saved_bind_fs_state)(struct pipe_context *pipe, void *shader); 292 void *saved_vs; 293 struct pipe_clip_state saved_clip; 294 struct i915_velems_state *saved_velems; 295 unsigned saved_nr_vertex_buffers; 296 struct pipe_vertex_buffer saved_vertex_buffers[PIPE_MAX_ATTRIBS]; 297 unsigned saved_nr_samplers; 298 void *saved_samplers[PIPE_MAX_SAMPLERS]; 299 void (*saved_bind_sampler_states)(struct pipe_context *pipe, 300 unsigned num, void **sampler); 301 unsigned saved_nr_sampler_views; 302 struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS]; 303 void (*saved_set_sampler_views)(struct pipe_context *pipe, 304 unsigned num, struct pipe_sampler_view **views); 305 }; 306 307 /* A flag for each state_tracker state object: 308 */ 309 #define I915_NEW_VIEWPORT 0x1 310 #define I915_NEW_RASTERIZER 0x2 311 #define I915_NEW_FS 0x4 312 #define I915_NEW_BLEND 0x8 313 #define I915_NEW_CLIP 0x10 314 #define I915_NEW_SCISSOR 0x20 315 #define I915_NEW_STIPPLE 0x40 316 #define I915_NEW_FRAMEBUFFER 0x80 317 #define I915_NEW_ALPHA_TEST 0x100 318 #define I915_NEW_DEPTH_STENCIL 0x200 319 #define I915_NEW_SAMPLER 0x400 320 #define I915_NEW_SAMPLER_VIEW 0x800 321 #define I915_NEW_VS_CONSTANTS 0x1000 322 #define I915_NEW_FS_CONSTANTS 0x2000 323 #define I915_NEW_GS_CONSTANTS 0x4000 324 #define I915_NEW_VBO 0x8000 325 #define I915_NEW_VS 0x10000 326 327 328 /* Driver's internally generated state flags: 329 */ 330 #define I915_NEW_VERTEX_FORMAT 0x10000 331 332 333 /* Dirty flags for hardware emit 334 */ 335 #define I915_HW_STATIC (1<<I915_CACHE_STATIC) 336 #define I915_HW_DYNAMIC (1<<I915_CACHE_DYNAMIC) 337 #define I915_HW_SAMPLER (1<<I915_CACHE_SAMPLER) 338 #define I915_HW_MAP (1<<I915_CACHE_MAP) 339 #define I915_HW_PROGRAM (1<<I915_CACHE_PROGRAM) 340 #define I915_HW_CONSTANTS (1<<I915_CACHE_CONSTANTS) 341 #define I915_HW_IMMEDIATE (1<<(I915_MAX_CACHE+0)) 342 #define I915_HW_INVARIANT (1<<(I915_MAX_CACHE+1)) 343 #define I915_HW_FLUSH (1<<(I915_MAX_CACHE+1)) 344 345 /* hw flush handling */ 346 #define I915_FLUSH_CACHE 1 347 #define I915_PIPELINE_FLUSH 2 348 349 /* split up static state */ 350 #define I915_DST_BUF_COLOR 1 351 #define I915_DST_BUF_DEPTH 2 352 #define I915_DST_VARS 4 353 #define I915_DST_RECT 8 354 355 static INLINE 356 void i915_set_flush_dirty(struct i915_context *i915, unsigned flush) 357 { 358 i915->hardware_dirty |= I915_HW_FLUSH; 359 i915->flush_dirty |= flush; 360 } 361 362 363 /*********************************************************************** 364 * i915_prim_emit.c: 365 */ 366 struct draw_stage *i915_draw_render_stage( struct i915_context *i915 ); 367 368 369 /*********************************************************************** 370 * i915_prim_vbuf.c: 371 */ 372 struct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 ); 373 374 375 /*********************************************************************** 376 * i915_state.c: 377 */ 378 void i915_prepare_vertex_sampling(struct i915_context *i915); 379 void i915_cleanup_vertex_sampling(struct i915_context *i915); 380 381 382 383 /*********************************************************************** 384 * i915_state_emit.c: 385 */ 386 void i915_emit_hardware_state(struct i915_context *i915 ); 387 388 389 390 /*********************************************************************** 391 * i915_clear.c: 392 */ 393 void i915_clear_blitter(struct pipe_context *pipe, unsigned buffers, 394 const union pipe_color_union *color, 395 double depth, unsigned stencil); 396 void i915_clear_render(struct pipe_context *pipe, unsigned buffers, 397 const union pipe_color_union *color, 398 double depth, unsigned stencil); 399 void i915_clear_emit(struct pipe_context *pipe, unsigned buffers, 400 const union pipe_color_union *color, 401 double depth, unsigned stencil, 402 unsigned destx, unsigned desty, unsigned width, unsigned height); 403 404 405 /*********************************************************************** 406 * 407 */ 408 void i915_init_state_functions( struct i915_context *i915 ); 409 void i915_init_fixup_state_functions( struct i915_context *i915 ); 410 void i915_init_flush_functions( struct i915_context *i915 ); 411 void i915_init_string_functions( struct i915_context *i915 ); 412 413 414 /************************************************************************ 415 * i915_context.c 416 */ 417 struct pipe_context *i915_create_context(struct pipe_screen *screen, 418 void *priv); 419 420 421 /*********************************************************************** 422 * Inline conversion functions. These are better-typed than the 423 * macros used previously: 424 */ 425 static INLINE struct i915_context * 426 i915_context( struct pipe_context *pipe ) 427 { 428 return (struct i915_context *)pipe; 429 } 430 431 432 #endif 433