i915_context.h revision 685340a53e1dcb2a888e634ee71ba24356befe69
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 41struct intel_winsys; 42struct intel_buffer; 43struct intel_batchbuffer; 44 45 46#define I915_TEX_UNITS 8 47 48#define I915_DYNAMIC_MODES4 0 49#define I915_DYNAMIC_DEPTHSCALE_0 1 /* just the header */ 50#define I915_DYNAMIC_DEPTHSCALE_1 2 51#define I915_DYNAMIC_IAB 3 52#define I915_DYNAMIC_BC_0 4 /* just the header */ 53#define I915_DYNAMIC_BC_1 5 54#define I915_DYNAMIC_BFO_0 6 55#define I915_DYNAMIC_BFO_1 7 56#define I915_DYNAMIC_STP_0 8 57#define I915_DYNAMIC_STP_1 9 58#define I915_DYNAMIC_SC_ENA_0 10 59#define I915_DYNAMIC_SC_RECT_0 11 60#define I915_DYNAMIC_SC_RECT_1 12 61#define I915_DYNAMIC_SC_RECT_2 13 62#define I915_MAX_DYNAMIC 14 63 64 65#define I915_IMMEDIATE_S0 0 66#define I915_IMMEDIATE_S1 1 67#define I915_IMMEDIATE_S2 2 68#define I915_IMMEDIATE_S3 3 69#define I915_IMMEDIATE_S4 4 70#define I915_IMMEDIATE_S5 5 71#define I915_IMMEDIATE_S6 6 72#define I915_IMMEDIATE_S7 7 73#define I915_MAX_IMMEDIATE 8 74 75/* These must mach the order of LI0_STATE_* bits, as they will be used 76 * to generate hardware packets: 77 */ 78#define I915_CACHE_STATIC 0 79#define I915_CACHE_DYNAMIC 1 /* handled specially */ 80#define I915_CACHE_SAMPLER 2 81#define I915_CACHE_MAP 3 82#define I915_CACHE_PROGRAM 4 83#define I915_CACHE_CONSTANTS 5 84#define I915_MAX_CACHE 6 85 86#define I915_MAX_CONSTANT 32 87 88 89/** See constant_flags[] below */ 90#define I915_CONSTFLAG_USER 0x1f 91 92 93/** 94 * Subclass of pipe_shader_state 95 */ 96struct i915_fragment_shader 97{ 98 struct pipe_shader_state state; 99 100 struct tgsi_shader_info info; 101 102 uint *program; 103 uint program_len; 104 105 /** 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. 113 */ 114 uint num_constants; 115 float constants[I915_MAX_CONSTANT][4]; 116 117 /** 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. 122 */ 123 ubyte constant_flags[I915_MAX_CONSTANT]; 124}; 125 126 127struct i915_cache_context; 128 129/* Use to calculate differences between state emitted to hardware and 130 * current driver-calculated state. 131 */ 132struct i915_state 133{ 134 unsigned immediate[I915_MAX_IMMEDIATE]; 135 unsigned dynamic[I915_MAX_DYNAMIC]; 136 137 float constants[PIPE_SHADER_TYPES][I915_MAX_CONSTANT][4]; 138 /** number of constants passed in through a constant buffer */ 139 uint num_user_constants[PIPE_SHADER_TYPES]; 140 141 /* texture sampler state */ 142 unsigned sampler[I915_TEX_UNITS][3]; 143 unsigned sampler_enable_flags; 144 unsigned sampler_enable_nr; 145 146 /* texture image buffers */ 147 unsigned texbuffer[I915_TEX_UNITS][2]; 148 149 /** Describes the current hardware vertex layout */ 150 struct vertex_info vertex_info; 151 152 unsigned id; /* track lost context events */ 153}; 154 155struct i915_blend_state { 156 unsigned iab; 157 unsigned modes4; 158 unsigned LIS5; 159 unsigned LIS6; 160}; 161 162struct i915_depth_stencil_state { 163 unsigned stencil_modes4; 164 unsigned bfo[2]; 165 unsigned stencil_LIS5; 166 unsigned depth_LIS6; 167}; 168 169struct i915_rasterizer_state { 170 unsigned light_twoside : 1; 171 unsigned st; 172 enum interp_mode color_interp; 173 174 unsigned LIS4; 175 unsigned LIS7; 176 unsigned sc[1]; 177 178 const struct pipe_rasterizer_state *templ; 179 180 union { float f; unsigned u; } ds[2]; 181}; 182 183struct i915_sampler_state { 184 unsigned state[3]; 185 const struct pipe_sampler_state *templ; 186 unsigned minlod; 187 unsigned maxlod; 188}; 189 190struct i915_velems_state { 191 unsigned count; 192 struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS]; 193}; 194 195#define I915_MAX_TEXTURE_2D_LEVELS 11 /* max 1024x1024 */ 196#define I915_MAX_TEXTURE_3D_LEVELS 8 /* max 128x128x128 */ 197 198struct i915_texture { 199 struct pipe_texture base; 200 201 /* Derived from the above: 202 */ 203 unsigned stride; 204 unsigned depth_stride; /* per-image on i945? */ 205 unsigned total_nblocksy; 206 207 unsigned sw_tiled; /**< tiled with software flags */ 208 unsigned hw_tiled; /**< tiled with hardware fences */ 209 210 unsigned nr_images[I915_MAX_TEXTURE_2D_LEVELS]; 211 212 /* Explicitly store the offset of each image for each cube face or 213 * depth value. Pretty much have to accept that hardware formats 214 * are going to be so diverse that there is no unified way to 215 * compute the offsets of depth/cube images within a mipmap level, 216 * so have to store them as a lookup table: 217 */ 218 unsigned *image_offset[I915_MAX_TEXTURE_2D_LEVELS]; /**< array [depth] of offsets */ 219 220 /* The data is held here: 221 */ 222 struct intel_buffer *buffer; 223}; 224 225struct i915_context 226{ 227 struct pipe_context base; 228 229 struct intel_winsys *iws; 230 231 struct draw_context *draw; 232 233 /* The most recent drawing state as set by the driver: 234 */ 235 const struct i915_blend_state *blend; 236 const struct i915_sampler_state *sampler[PIPE_MAX_SAMPLERS]; 237 const struct i915_depth_stencil_state *depth_stencil; 238 const struct i915_rasterizer_state *rasterizer; 239 240 struct i915_fragment_shader *fs; 241 242 struct pipe_blend_color blend_color; 243 struct pipe_stencil_ref stencil_ref; 244 struct pipe_clip_state clip; 245 /* XXX unneded */ 246 struct pipe_buffer *constants[PIPE_SHADER_TYPES]; 247 struct pipe_framebuffer_state framebuffer; 248 struct pipe_poly_stipple poly_stipple; 249 struct pipe_scissor_state scissor; 250 struct i915_texture *texture[PIPE_MAX_SAMPLERS]; 251 struct pipe_viewport_state viewport; 252 struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS]; 253 254 unsigned dirty; 255 256 unsigned num_samplers; 257 unsigned num_textures; 258 unsigned num_vertex_buffers; 259 260 struct intel_batchbuffer *batch; 261 262 /** Vertex buffer */ 263 struct intel_buffer *vbo; 264 size_t vbo_offset; 265 unsigned vbo_flushed; 266 267 struct i915_state current; 268 unsigned hardware_dirty; 269 270 unsigned debug; 271}; 272 273/* A flag for each state_tracker state object: 274 */ 275#define I915_NEW_VIEWPORT 0x1 276#define I915_NEW_RASTERIZER 0x2 277#define I915_NEW_FS 0x4 278#define I915_NEW_BLEND 0x8 279#define I915_NEW_CLIP 0x10 280#define I915_NEW_SCISSOR 0x20 281#define I915_NEW_STIPPLE 0x40 282#define I915_NEW_FRAMEBUFFER 0x80 283#define I915_NEW_ALPHA_TEST 0x100 284#define I915_NEW_DEPTH_STENCIL 0x200 285#define I915_NEW_SAMPLER 0x400 286#define I915_NEW_TEXTURE 0x800 287#define I915_NEW_CONSTANTS 0x1000 288#define I915_NEW_VBO 0x2000 289#define I915_NEW_VS 0x4000 290 291 292/* Driver's internally generated state flags: 293 */ 294#define I915_NEW_VERTEX_FORMAT 0x10000 295 296 297/* Dirty flags for hardware emit 298 */ 299#define I915_HW_STATIC (1<<I915_CACHE_STATIC) 300#define I915_HW_DYNAMIC (1<<I915_CACHE_DYNAMIC) 301#define I915_HW_SAMPLER (1<<I915_CACHE_SAMPLER) 302#define I915_HW_MAP (1<<I915_CACHE_MAP) 303#define I915_HW_PROGRAM (1<<I915_CACHE_PROGRAM) 304#define I915_HW_CONSTANTS (1<<I915_CACHE_CONSTANTS) 305#define I915_HW_IMMEDIATE (1<<(I915_MAX_CACHE+0)) 306#define I915_HW_INVARIENT (1<<(I915_MAX_CACHE+1)) 307 308 309/*********************************************************************** 310 * i915_prim_emit.c: 311 */ 312struct draw_stage *i915_draw_render_stage( struct i915_context *i915 ); 313 314 315/*********************************************************************** 316 * i915_prim_vbuf.c: 317 */ 318struct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 ); 319 320 321/*********************************************************************** 322 * i915_state_emit.c: 323 */ 324void i915_emit_hardware_state(struct i915_context *i915 ); 325 326 327 328/*********************************************************************** 329 * i915_clear.c: 330 */ 331void i915_clear( struct pipe_context *pipe, unsigned buffers, const float *rgba, 332 double depth, unsigned stencil); 333 334 335/*********************************************************************** 336 * i915_surface.c: 337 */ 338void i915_init_surface_functions( struct i915_context *i915 ); 339 340void i915_init_state_functions( struct i915_context *i915 ); 341void i915_init_flush_functions( struct i915_context *i915 ); 342void i915_init_string_functions( struct i915_context *i915 ); 343 344 345/************************************************************************ 346 * i915_context.c 347 */ 348struct pipe_context *i915_create_context(struct pipe_screen *screen, 349 void *priv); 350 351 352/*********************************************************************** 353 * Inline conversion functions. These are better-typed than the 354 * macros used previously: 355 */ 356static INLINE struct i915_context * 357i915_context( struct pipe_context *pipe ) 358{ 359 return (struct i915_context *)pipe; 360} 361 362 363 364#endif 365