intel_context.h revision a389d6bd566ba241a285c3a33039d5e964bc8f30
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 INTELCONTEXT_INC 29#define INTELCONTEXT_INC 30 31 32 33#include "main/mtypes.h" 34#include "main/mm.h" 35#include "texmem.h" 36#include "dri_metaops.h" 37#include "drm.h" 38#include "intel_bufmgr.h" 39 40#include "intel_screen.h" 41#include "intel_tex_obj.h" 42#include "i915_drm.h" 43#include "tnl/t_vertex.h" 44 45#define TAG(x) intel##x 46#include "tnl_dd/t_dd_vertex.h" 47#undef TAG 48 49#define DV_PF_555 (1<<8) 50#define DV_PF_565 (2<<8) 51#define DV_PF_8888 (3<<8) 52#define DV_PF_4444 (8<<8) 53#define DV_PF_1555 (9<<8) 54 55struct intel_region; 56struct intel_context; 57 58typedef void (*intel_tri_func) (struct intel_context *, intelVertex *, 59 intelVertex *, intelVertex *); 60typedef void (*intel_line_func) (struct intel_context *, intelVertex *, 61 intelVertex *); 62typedef void (*intel_point_func) (struct intel_context *, intelVertex *); 63 64/** 65 * Bits for intel->Fallback field 66 */ 67/*@{*/ 68#define INTEL_FALLBACK_DRAW_BUFFER 0x1 69#define INTEL_FALLBACK_READ_BUFFER 0x2 70#define INTEL_FALLBACK_DEPTH_BUFFER 0x4 71#define INTEL_FALLBACK_STENCIL_BUFFER 0x8 72#define INTEL_FALLBACK_USER 0x10 73#define INTEL_FALLBACK_RENDERMODE 0x20 74#define INTEL_FALLBACK_TEXTURE 0x40 75#define INTEL_FALLBACK_DRIVER 0x1000 /**< first for drivers */ 76/*@}*/ 77 78extern void intelFallback(struct intel_context *intel, GLbitfield bit, 79 GLboolean mode); 80#define FALLBACK( intel, bit, mode ) intelFallback( intel, bit, mode ) 81 82 83#define INTEL_WRITE_PART 0x1 84#define INTEL_WRITE_FULL 0x2 85#define INTEL_READ 0x4 86 87#define INTEL_MAX_FIXUP 64 88 89struct intel_sync_object { 90 struct gl_sync_object Base; 91 92 /** Batch associated with this sync object */ 93 drm_intel_bo *bo; 94}; 95 96/** 97 * intel_context is derived from Mesa's context class: GLcontext. 98 */ 99struct intel_context 100{ 101 GLcontext ctx; /**< base class, must be first field */ 102 103 struct 104 { 105 void (*destroy) (struct intel_context * intel); 106 void (*emit_state) (struct intel_context * intel); 107 void (*finish_batch) (struct intel_context * intel); 108 void (*new_batch) (struct intel_context * intel); 109 void (*emit_invarient_state) (struct intel_context * intel); 110 void (*update_texture_state) (struct intel_context * intel); 111 112 void (*render_start) (struct intel_context * intel); 113 void (*render_prevalidate) (struct intel_context * intel); 114 void (*set_draw_region) (struct intel_context * intel, 115 struct intel_region * draw_regions[], 116 struct intel_region * depth_region, 117 GLuint num_regions); 118 119 void (*reduced_primitive_state) (struct intel_context * intel, 120 GLenum rprim); 121 122 GLboolean (*check_vertex_size) (struct intel_context * intel, 123 GLuint expected); 124 void (*invalidate_state) (struct intel_context *intel, 125 GLuint new_state); 126 127 128 /* Metaops: 129 */ 130 void (*install_meta_state) (struct intel_context * intel); 131 void (*leave_meta_state) (struct intel_context * intel); 132 133 void (*meta_draw_region) (struct intel_context * intel, 134 struct intel_region * draw_region, 135 struct intel_region * depth_region); 136 137 void (*meta_color_mask) (struct intel_context * intel, GLboolean); 138 139 void (*meta_stencil_replace) (struct intel_context * intel, 140 GLuint mask, GLuint clear); 141 142 void (*meta_depth_replace) (struct intel_context * intel); 143 144 void (*meta_texture_blend_replace) (struct intel_context * intel); 145 146 void (*meta_no_stencil_write) (struct intel_context * intel); 147 void (*meta_no_depth_write) (struct intel_context * intel); 148 void (*meta_no_texture) (struct intel_context * intel); 149 150 void (*meta_import_pixel_state) (struct intel_context * intel); 151 void (*meta_frame_buffer_texture) (struct intel_context *intel, 152 GLint xoff, GLint yoff); 153 154 GLboolean(*meta_tex_rect_source) (struct intel_context * intel, 155 dri_bo * buffer, 156 GLuint offset, 157 GLuint pitch, 158 GLuint height, 159 GLenum format, GLenum type); 160 161 void (*assert_not_dirty) (struct intel_context *intel); 162 163 void (*debug_batch)(struct intel_context *intel); 164 } vtbl; 165 166 struct dri_metaops meta; 167 168 GLbitfield Fallback; /**< mask of INTEL_FALLBACK_x bits */ 169 GLuint NewGLState; 170 171 dri_bufmgr *bufmgr; 172 unsigned int maxBatchSize; 173 174 /** 175 * Generation number of the hardware: 2 is 8xx, 3 is 9xx pre-965, 4 is 965. 176 */ 177 int gen; 178 GLboolean needs_ff_sync; 179 GLboolean is_ironlake; 180 GLboolean is_g4x; 181 GLboolean is_945; 182 GLboolean has_luminance_srgb; 183 184 int urb_size; 185 186 struct intel_batchbuffer *batch; 187 drm_intel_bo *first_post_swapbuffers_batch; 188 GLboolean no_batch_wrap; 189 GLboolean using_dri2_swapbuffers; 190 191 struct 192 { 193 GLuint id; 194 uint32_t primitive; /**< Current hardware primitive type */ 195 void (*flush) (struct intel_context *); 196 GLubyte *start_ptr; /**< for i8xx */ 197 dri_bo *vb_bo; 198 uint8_t *vb; 199 unsigned int start_offset; /**< Byte offset of primitive sequence */ 200 unsigned int current_offset; /**< Byte offset of next vertex */ 201 unsigned int count; /**< Number of vertices in current primitive */ 202 } prim; 203 204 GLuint stats_wm; 205 GLboolean locked; 206 char *prevLockFile; 207 int prevLockLine; 208 209 /* Offsets of fields within the current vertex: 210 */ 211 GLuint coloroffset; 212 GLuint specoffset; 213 GLuint wpos_offset; 214 GLuint wpos_size; 215 216 struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX]; 217 GLuint vertex_attr_count; 218 219 GLfloat polygon_offset_scale; /* dependent on depth_scale, bpp */ 220 221 GLboolean hw_stencil; 222 GLboolean hw_stipple; 223 GLboolean depth_buffer_is_float; 224 GLboolean no_rast; 225 GLboolean no_hw; 226 GLboolean always_flush_batch; 227 GLboolean always_flush_cache; 228 229 /* 0 - nonconformant, best performance; 230 * 1 - fallback to sw for known conformance bugs 231 * 2 - always fallback to sw 232 */ 233 GLuint conformance_mode; 234 235 /* State for intelvb.c and inteltris.c. 236 */ 237 GLuint RenderIndex; 238 GLmatrix ViewportMatrix; 239 GLenum render_primitive; 240 GLenum reduced_primitive; 241 GLuint vertex_size; 242 GLubyte *verts; /* points to tnl->clipspace.vertex_buf */ 243 244 /* Fallback rasterization functions 245 */ 246 intel_point_func draw_point; 247 intel_line_func draw_line; 248 intel_tri_func draw_tri; 249 250 /** 251 * Set if rendering has occured to the drawable's front buffer. 252 * 253 * This is used in the DRI2 case to detect that glFlush should also copy 254 * the contents of the fake front buffer to the real front buffer. 255 */ 256 GLboolean front_buffer_dirty; 257 258 /** 259 * Track whether front-buffer rendering is currently enabled 260 * 261 * A separate flag is used to track this in order to support MRT more 262 * easily. 263 */ 264 GLboolean is_front_buffer_rendering; 265 /** 266 * Track whether front-buffer is the current read target. 267 * 268 * This is closely associated with is_front_buffer_rendering, but may 269 * be set separately. The DRI2 fake front buffer must be referenced 270 * either way. 271 */ 272 GLboolean is_front_buffer_reading; 273 274 GLboolean use_texture_tiling; 275 GLboolean use_early_z; 276 277 int driFd; 278 279 __DRIcontext *driContext; 280 __DRIdrawable *driDrawable; 281 __DRIdrawable *driReadDrawable; 282 __DRIscreen *driScreen; 283 intelScreenPrivate *intelScreen; 284 285 /** 286 * Configuration cache 287 */ 288 driOptionCache optionCache; 289}; 290 291extern char *__progname; 292 293 294#define SUBPIXEL_X 0.125 295#define SUBPIXEL_Y 0.125 296 297#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) 298#define ALIGN(value, alignment) ((value + alignment - 1) & ~(alignment - 1)) 299#define IS_POWER_OF_TWO(val) (((val) & (val - 1)) == 0) 300 301static INLINE uint32_t 302U_FIXED(float value, uint32_t frac_bits) 303{ 304 value *= (1 << frac_bits); 305 return value < 0 ? 0 : value; 306} 307 308static INLINE uint32_t 309S_FIXED(float value, uint32_t frac_bits) 310{ 311 return value * (1 << frac_bits); 312} 313 314#define INTEL_FIREVERTICES(intel) \ 315do { \ 316 if ((intel)->prim.flush) \ 317 (intel)->prim.flush(intel); \ 318} while (0) 319 320/* ================================================================ 321 * From linux kernel i386 header files, copes with odd sizes better 322 * than COPY_DWORDS would: 323 * XXX Put this in src/mesa/main/imports.h ??? 324 */ 325#if defined(i386) || defined(__i386__) 326static INLINE void * __memcpy(void * to, const void * from, size_t n) 327{ 328 int d0, d1, d2; 329 __asm__ __volatile__( 330 "rep ; movsl\n\t" 331 "testb $2,%b4\n\t" 332 "je 1f\n\t" 333 "movsw\n" 334 "1:\ttestb $1,%b4\n\t" 335 "je 2f\n\t" 336 "movsb\n" 337 "2:" 338 : "=&c" (d0), "=&D" (d1), "=&S" (d2) 339 :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from) 340 : "memory"); 341 return (to); 342} 343#else 344#define __memcpy(a,b,c) memcpy(a,b,c) 345#endif 346 347 348/* ================================================================ 349 * Debugging: 350 */ 351extern int INTEL_DEBUG; 352 353#define DEBUG_TEXTURE 0x1 354#define DEBUG_STATE 0x2 355#define DEBUG_IOCTL 0x4 356#define DEBUG_BLIT 0x8 357#define DEBUG_MIPTREE 0x10 358#define DEBUG_FALLBACKS 0x20 359#define DEBUG_VERBOSE 0x40 360#define DEBUG_BATCH 0x80 361#define DEBUG_PIXEL 0x100 362#define DEBUG_BUFMGR 0x200 363#define DEBUG_REGION 0x400 364#define DEBUG_FBO 0x800 365#define DEBUG_LOCK 0x1000 366#define DEBUG_SYNC 0x2000 367#define DEBUG_PRIMS 0x4000 368#define DEBUG_VERTS 0x8000 369#define DEBUG_DRI 0x10000 370#define DEBUG_DMA 0x20000 371#define DEBUG_SANITY 0x40000 372#define DEBUG_SLEEP 0x80000 373#define DEBUG_STATS 0x100000 374#define DEBUG_TILE 0x200000 375#define DEBUG_SINGLE_THREAD 0x400000 376#define DEBUG_WM 0x800000 377#define DEBUG_URB 0x1000000 378#define DEBUG_VS 0x2000000 379 380#define DBG(...) do { \ 381 if (INTEL_DEBUG & FILE_DEBUG_FLAG) \ 382 _mesa_printf(__VA_ARGS__); \ 383} while(0) 384 385#define PCI_CHIP_845_G 0x2562 386#define PCI_CHIP_I830_M 0x3577 387#define PCI_CHIP_I855_GM 0x3582 388#define PCI_CHIP_I865_G 0x2572 389#define PCI_CHIP_I915_G 0x2582 390#define PCI_CHIP_I915_GM 0x2592 391#define PCI_CHIP_I945_G 0x2772 392#define PCI_CHIP_I945_GM 0x27A2 393#define PCI_CHIP_I945_GME 0x27AE 394#define PCI_CHIP_G33_G 0x29C2 395#define PCI_CHIP_Q35_G 0x29B2 396#define PCI_CHIP_Q33_G 0x29D2 397 398 399/* ================================================================ 400 * intel_context.c: 401 */ 402 403extern GLboolean intelInitContext(struct intel_context *intel, 404 const __GLcontextModes * mesaVis, 405 __DRIcontext * driContextPriv, 406 void *sharedContextPrivate, 407 struct dd_function_table *functions); 408 409extern void intelFinish(GLcontext * ctx); 410extern void intelFlush(GLcontext * ctx); 411extern void intel_flush(GLcontext * ctx, GLboolean needs_mi_flush); 412 413extern void intelInitDriverFunctions(struct dd_function_table *functions); 414 415void intel_init_syncobj_functions(struct dd_function_table *functions); 416 417 418/* ================================================================ 419 * intel_state.c: 420 */ 421extern void intelInitStateFuncs(struct dd_function_table *functions); 422 423#define COMPAREFUNC_ALWAYS 0 424#define COMPAREFUNC_NEVER 0x1 425#define COMPAREFUNC_LESS 0x2 426#define COMPAREFUNC_EQUAL 0x3 427#define COMPAREFUNC_LEQUAL 0x4 428#define COMPAREFUNC_GREATER 0x5 429#define COMPAREFUNC_NOTEQUAL 0x6 430#define COMPAREFUNC_GEQUAL 0x7 431 432#define STENCILOP_KEEP 0 433#define STENCILOP_ZERO 0x1 434#define STENCILOP_REPLACE 0x2 435#define STENCILOP_INCRSAT 0x3 436#define STENCILOP_DECRSAT 0x4 437#define STENCILOP_INCR 0x5 438#define STENCILOP_DECR 0x6 439#define STENCILOP_INVERT 0x7 440 441#define LOGICOP_CLEAR 0 442#define LOGICOP_NOR 0x1 443#define LOGICOP_AND_INV 0x2 444#define LOGICOP_COPY_INV 0x3 445#define LOGICOP_AND_RVRSE 0x4 446#define LOGICOP_INV 0x5 447#define LOGICOP_XOR 0x6 448#define LOGICOP_NAND 0x7 449#define LOGICOP_AND 0x8 450#define LOGICOP_EQUIV 0x9 451#define LOGICOP_NOOP 0xa 452#define LOGICOP_OR_INV 0xb 453#define LOGICOP_COPY 0xc 454#define LOGICOP_OR_RVRSE 0xd 455#define LOGICOP_OR 0xe 456#define LOGICOP_SET 0xf 457 458#define BLENDFACT_ZERO 0x01 459#define BLENDFACT_ONE 0x02 460#define BLENDFACT_SRC_COLR 0x03 461#define BLENDFACT_INV_SRC_COLR 0x04 462#define BLENDFACT_SRC_ALPHA 0x05 463#define BLENDFACT_INV_SRC_ALPHA 0x06 464#define BLENDFACT_DST_ALPHA 0x07 465#define BLENDFACT_INV_DST_ALPHA 0x08 466#define BLENDFACT_DST_COLR 0x09 467#define BLENDFACT_INV_DST_COLR 0x0a 468#define BLENDFACT_SRC_ALPHA_SATURATE 0x0b 469#define BLENDFACT_CONST_COLOR 0x0c 470#define BLENDFACT_INV_CONST_COLOR 0x0d 471#define BLENDFACT_CONST_ALPHA 0x0e 472#define BLENDFACT_INV_CONST_ALPHA 0x0f 473#define BLENDFACT_MASK 0x0f 474 475enum { 476 DRI_CONF_BO_REUSE_DISABLED, 477 DRI_CONF_BO_REUSE_ALL 478}; 479 480extern int intel_translate_shadow_compare_func(GLenum func); 481extern int intel_translate_compare_func(GLenum func); 482extern int intel_translate_stencil_op(GLenum op); 483extern int intel_translate_blend_factor(GLenum factor); 484extern int intel_translate_logic_op(GLenum opcode); 485 486void intel_viewport(GLcontext * ctx, GLint x, GLint y, 487 GLsizei width, GLsizei height); 488 489void intel_update_renderbuffers(__DRIcontext *context, 490 __DRIdrawable *drawable); 491 492void i915_set_buf_info_for_region(uint32_t *state, struct intel_region *region, 493 uint32_t buffer_id); 494 495/*====================================================================== 496 * Inline conversion functions. 497 * These are better-typed than the macros used previously: 498 */ 499static INLINE struct intel_context * 500intel_context(GLcontext * ctx) 501{ 502 return (struct intel_context *) ctx; 503} 504 505static INLINE GLboolean 506is_power_of_two(uint32_t value) 507{ 508 return (value & (value - 1)) == 0; 509} 510 511static INLINE void 512intel_bo_map_gtt_preferred(struct intel_context *intel, 513 drm_intel_bo *bo, 514 GLboolean write) 515{ 516 if (intel->intelScreen->kernel_exec_fencing) 517 drm_intel_gem_bo_map_gtt(bo); 518 else 519 drm_intel_bo_map(bo, write); 520} 521 522static INLINE void 523intel_bo_unmap_gtt_preferred(struct intel_context *intel, 524 drm_intel_bo *bo) 525{ 526 if (intel->intelScreen->kernel_exec_fencing) 527 drm_intel_gem_bo_unmap_gtt(bo); 528 else 529 drm_intel_bo_unmap(bo); 530} 531 532#endif 533