intel_context.h revision 39c5fd7f134cc52e7e93553c5c8238b9b531754a
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#include <stdbool.h> 33#include <string.h> 34#include "main/mtypes.h" 35#include "main/mm.h" 36 37#ifdef __cplusplus 38extern "C" { 39 /* Evil hack for using libdrm in a c++ compiler. */ 40 #define virtual virt 41#endif 42 43#include "drm.h" 44#include "intel_bufmgr.h" 45 46#include "intel_screen.h" 47#include "intel_tex_obj.h" 48#include "i915_drm.h" 49 50#ifdef __cplusplus 51 #undef virtual 52#endif 53 54#include "tnl/t_vertex.h" 55 56#define TAG(x) intel##x 57#include "tnl_dd/t_dd_vertex.h" 58#undef TAG 59 60#define DV_PF_555 (1<<8) 61#define DV_PF_565 (2<<8) 62#define DV_PF_8888 (3<<8) 63#define DV_PF_4444 (8<<8) 64#define DV_PF_1555 (9<<8) 65 66struct intel_region; 67struct intel_context; 68 69typedef void (*intel_tri_func) (struct intel_context *, intelVertex *, 70 intelVertex *, intelVertex *); 71typedef void (*intel_line_func) (struct intel_context *, intelVertex *, 72 intelVertex *); 73typedef void (*intel_point_func) (struct intel_context *, intelVertex *); 74 75/** 76 * Bits for intel->Fallback field 77 */ 78/*@{*/ 79#define INTEL_FALLBACK_DRAW_BUFFER 0x1 80#define INTEL_FALLBACK_READ_BUFFER 0x2 81#define INTEL_FALLBACK_DEPTH_BUFFER 0x4 82#define INTEL_FALLBACK_STENCIL_BUFFER 0x8 83#define INTEL_FALLBACK_USER 0x10 84#define INTEL_FALLBACK_RENDERMODE 0x20 85#define INTEL_FALLBACK_TEXTURE 0x40 86#define INTEL_FALLBACK_DRIVER 0x1000 /**< first for drivers */ 87/*@}*/ 88 89extern void intelFallback(struct intel_context *intel, GLbitfield bit, 90 bool mode); 91#define FALLBACK( intel, bit, mode ) intelFallback( intel, bit, mode ) 92 93 94#define INTEL_WRITE_PART 0x1 95#define INTEL_WRITE_FULL 0x2 96#define INTEL_READ 0x4 97 98#define INTEL_MAX_FIXUP 64 99 100#ifndef likely 101#ifdef __GNUC__ 102#define likely(expr) (__builtin_expect(expr, 1)) 103#define unlikely(expr) (__builtin_expect(expr, 0)) 104#else 105#define likely(expr) (expr) 106#define unlikely(expr) (expr) 107#endif 108#endif 109 110struct intel_sync_object { 111 struct gl_sync_object Base; 112 113 /** Batch associated with this sync object */ 114 drm_intel_bo *bo; 115}; 116 117struct brw_context; 118 119struct intel_batchbuffer { 120 /** Current batchbuffer being queued up. */ 121 drm_intel_bo *bo; 122 /** Last BO submitted to the hardware. Used for glFinish(). */ 123 drm_intel_bo *last_bo; 124 125 uint16_t emit, total; 126 uint16_t used, reserved_space; 127 uint32_t *map; 128 uint32_t *cpu_map; 129#define BATCH_SZ (8192*sizeof(uint32_t)) 130}; 131 132/** 133 * intel_context is derived from Mesa's context class: struct gl_context. 134 */ 135struct intel_context 136{ 137 struct gl_context ctx; /**< base class, must be first field */ 138 139 struct 140 { 141 void (*destroy) (struct intel_context * intel); 142 void (*emit_state) (struct intel_context * intel); 143 void (*finish_batch) (struct intel_context * intel); 144 void (*new_batch) (struct intel_context * intel); 145 void (*emit_invarient_state) (struct intel_context * intel); 146 void (*update_texture_state) (struct intel_context * intel); 147 148 void (*render_start) (struct intel_context * intel); 149 void (*render_prevalidate) (struct intel_context * intel); 150 void (*set_draw_region) (struct intel_context * intel, 151 struct intel_region * draw_regions[], 152 struct intel_region * depth_region, 153 GLuint num_regions); 154 void (*update_draw_buffer)(struct intel_context *intel); 155 156 void (*reduced_primitive_state) (struct intel_context * intel, 157 GLenum rprim); 158 159 bool (*check_vertex_size) (struct intel_context * intel, 160 GLuint expected); 161 void (*invalidate_state) (struct intel_context *intel, 162 GLuint new_state); 163 164 void (*assert_not_dirty) (struct intel_context *intel); 165 166 void (*debug_batch)(struct intel_context *intel); 167 void (*annotate_aub)(struct intel_context *intel); 168 bool (*render_target_supported)(struct intel_context *intel, 169 struct gl_renderbuffer *rb); 170 } vtbl; 171 172 GLbitfield Fallback; /**< mask of INTEL_FALLBACK_x bits */ 173 GLuint NewGLState; 174 175 dri_bufmgr *bufmgr; 176 unsigned int maxBatchSize; 177 178 /** 179 * Generation number of the hardware: 2 is 8xx, 3 is 9xx pre-965, 4 is 965. 180 */ 181 int gen; 182 bool is_945; 183 bool has_swizzling; 184 185 struct intel_batchbuffer batch; 186 187 drm_intel_bo *first_post_swapbuffers_batch; 188 bool need_throttle; 189 bool no_batch_wrap; 190 bool tnl_pipeline_running; /**< Set while i915's _tnl_run_pipeline. */ 191 192 /** 193 * Set if we're either a debug context or the INTEL_DEBUG=perf environment 194 * variable is set, this is the flag indicating to do expensive work that 195 * might lead to a perf_debug() call. 196 */ 197 bool perf_debug; 198 199 struct 200 { 201 GLuint id; 202 uint32_t start_ptr; /**< for i8xx */ 203 uint32_t primitive; /**< Current hardware primitive type */ 204 void (*flush) (struct intel_context *); 205 drm_intel_bo *vb_bo; 206 uint8_t *vb; 207 unsigned int start_offset; /**< Byte offset of primitive sequence */ 208 unsigned int current_offset; /**< Byte offset of next vertex */ 209 unsigned int count; /**< Number of vertices in current primitive */ 210 } prim; 211 212 struct { 213 drm_intel_bo *bo; 214 GLuint offset; 215 uint32_t buffer_len; 216 uint32_t buffer_offset; 217 char buffer[4096]; 218 } upload; 219 220 uint32_t max_gtt_map_object_size; 221 222 GLuint stats_wm; 223 224 /* Offsets of fields within the current vertex: 225 */ 226 GLuint coloroffset; 227 GLuint specoffset; 228 GLuint wpos_offset; 229 230 struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX]; 231 GLuint vertex_attr_count; 232 233 GLfloat polygon_offset_scale; /* dependent on depth_scale, bpp */ 234 235 bool hw_stencil; 236 bool hw_stipple; 237 bool no_rast; 238 bool always_flush_batch; 239 bool always_flush_cache; 240 bool disable_throttling; 241 242 /* State for intelvb.c and inteltris.c. 243 */ 244 GLuint RenderIndex; 245 GLmatrix ViewportMatrix; 246 GLenum render_primitive; 247 GLenum reduced_primitive; /*< Only gen < 6 */ 248 GLuint vertex_size; 249 GLubyte *verts; /* points to tnl->clipspace.vertex_buf */ 250 251 /* Fallback rasterization functions 252 */ 253 intel_point_func draw_point; 254 intel_line_func draw_line; 255 intel_tri_func draw_tri; 256 257 /** 258 * Set if rendering has occured to the drawable's front buffer. 259 * 260 * This is used in the DRI2 case to detect that glFlush should also copy 261 * the contents of the fake front buffer to the real front buffer. 262 */ 263 bool front_buffer_dirty; 264 265 /** 266 * Track whether front-buffer rendering is currently enabled 267 * 268 * A separate flag is used to track this in order to support MRT more 269 * easily. 270 */ 271 bool is_front_buffer_rendering; 272 /** 273 * Track whether front-buffer is the current read target. 274 * 275 * This is closely associated with is_front_buffer_rendering, but may 276 * be set separately. The DRI2 fake front buffer must be referenced 277 * either way. 278 */ 279 bool is_front_buffer_reading; 280 281 bool use_early_z; 282 283 int driFd; 284 285 __DRIcontext *driContext; 286 struct intel_screen *intelScreen; 287 void (*saved_viewport)(struct gl_context * ctx, 288 GLint x, GLint y, GLsizei width, GLsizei height); 289 290 /** 291 * Configuration cache 292 */ 293 driOptionCache optionCache; 294}; 295 296extern char *__progname; 297 298 299#define SUBPIXEL_X 0.125 300#define SUBPIXEL_Y 0.125 301 302/** 303 * Align a value down to an alignment value 304 * 305 * If \c value is not already aligned to the requested alignment value, it 306 * will be rounded down. 307 * 308 * \param value Value to be rounded 309 * \param alignment Alignment value to be used. This must be a power of two. 310 * 311 * \sa ALIGN() 312 */ 313#define ROUND_DOWN_TO(value, alignment) ((value) & ~(alignment - 1)) 314 315static INLINE uint32_t 316U_FIXED(float value, uint32_t frac_bits) 317{ 318 value *= (1 << frac_bits); 319 return value < 0 ? 0 : value; 320} 321 322static INLINE uint32_t 323S_FIXED(float value, uint32_t frac_bits) 324{ 325 return value * (1 << frac_bits); 326} 327 328#define INTEL_FIREVERTICES(intel) \ 329do { \ 330 if ((intel)->prim.flush) \ 331 (intel)->prim.flush(intel); \ 332} while (0) 333 334/* ================================================================ 335 * From linux kernel i386 header files, copes with odd sizes better 336 * than COPY_DWORDS would: 337 * XXX Put this in src/mesa/main/imports.h ??? 338 */ 339#if defined(i386) || defined(__i386__) 340static INLINE void * __memcpy(void * to, const void * from, size_t n) 341{ 342 int d0, d1, d2; 343 __asm__ __volatile__( 344 "rep ; movsl\n\t" 345 "testb $2,%b4\n\t" 346 "je 1f\n\t" 347 "movsw\n" 348 "1:\ttestb $1,%b4\n\t" 349 "je 2f\n\t" 350 "movsb\n" 351 "2:" 352 : "=&c" (d0), "=&D" (d1), "=&S" (d2) 353 :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from) 354 : "memory"); 355 return (to); 356} 357#else 358#define __memcpy(a,b,c) memcpy(a,b,c) 359#endif 360 361 362/* ================================================================ 363 * Debugging: 364 */ 365extern int INTEL_DEBUG; 366 367#define DEBUG_TEXTURE 0x1 368#define DEBUG_STATE 0x2 369#define DEBUG_IOCTL 0x4 370#define DEBUG_BLIT 0x8 371#define DEBUG_MIPTREE 0x10 372#define DEBUG_PERF 0x20 373#define DEBUG_BATCH 0x80 374#define DEBUG_PIXEL 0x100 375#define DEBUG_BUFMGR 0x200 376#define DEBUG_REGION 0x400 377#define DEBUG_FBO 0x800 378#define DEBUG_GS 0x1000 379#define DEBUG_SYNC 0x2000 380#define DEBUG_PRIMS 0x4000 381#define DEBUG_VERTS 0x8000 382#define DEBUG_DRI 0x10000 383#define DEBUG_SF 0x20000 384#define DEBUG_STATS 0x100000 385#define DEBUG_WM 0x400000 386#define DEBUG_URB 0x800000 387#define DEBUG_VS 0x1000000 388#define DEBUG_CLIP 0x2000000 389#define DEBUG_AUB 0x4000000 390#define DEBUG_BLORP 0x10000000 391#define DEBUG_NO16 0x20000000 392 393#ifdef HAVE_ANDROID_PLATFORM 394#define LOG_TAG "INTEL-MESA" 395#include <cutils/log.h> 396#ifndef ALOGW 397#define ALOGW LOGW 398#endif 399#define dbg_printf(...) ALOGW(__VA_ARGS__) 400#else 401#define dbg_printf(...) printf(__VA_ARGS__) 402#endif /* HAVE_ANDROID_PLATFORM */ 403 404#define DBG(...) do { \ 405 if (unlikely(INTEL_DEBUG & FILE_DEBUG_FLAG)) \ 406 dbg_printf(__VA_ARGS__); \ 407} while(0) 408 409#define perf_debug(...) do { \ 410 static GLuint msg_id = 0; \ 411 if (unlikely(INTEL_DEBUG & DEBUG_PERF)) \ 412 dbg_printf(__VA_ARGS__); \ 413 if (intel->perf_debug) \ 414 _mesa_gl_debug(&intel->ctx, &msg_id, \ 415 MESA_DEBUG_TYPE_PERFORMANCE, \ 416 MESA_DEBUG_SEVERITY_MEDIUM, \ 417 __VA_ARGS__); \ 418} while(0) 419 420#define WARN_ONCE(cond, fmt...) do { \ 421 if (unlikely(cond)) { \ 422 static bool _warned = false; \ 423 static GLuint msg_id = 0; \ 424 if (!_warned) { \ 425 fprintf(stderr, "WARNING: "); \ 426 fprintf(stderr, fmt); \ 427 _warned = true; \ 428 \ 429 _mesa_gl_debug(ctx, &msg_id, \ 430 MESA_DEBUG_TYPE_OTHER, \ 431 MESA_DEBUG_SEVERITY_HIGH, fmt); \ 432 } \ 433 } \ 434} while (0) 435 436#define PCI_CHIP_845_G 0x2562 437#define PCI_CHIP_I830_M 0x3577 438#define PCI_CHIP_I855_GM 0x3582 439#define PCI_CHIP_I865_G 0x2572 440#define PCI_CHIP_I915_G 0x2582 441#define PCI_CHIP_I915_GM 0x2592 442#define PCI_CHIP_I945_G 0x2772 443#define PCI_CHIP_I945_GM 0x27A2 444#define PCI_CHIP_I945_GME 0x27AE 445#define PCI_CHIP_G33_G 0x29C2 446#define PCI_CHIP_Q35_G 0x29B2 447#define PCI_CHIP_Q33_G 0x29D2 448 449 450/* ================================================================ 451 * intel_context.c: 452 */ 453 454extern bool intelInitContext(struct intel_context *intel, 455 int api, 456 unsigned major_version, 457 unsigned minor_version, 458 const struct gl_config * mesaVis, 459 __DRIcontext * driContextPriv, 460 void *sharedContextPrivate, 461 struct dd_function_table *functions, 462 unsigned *dri_ctx_error); 463 464extern void intelFinish(struct gl_context * ctx); 465extern void intel_flush_rendering_to_batch(struct gl_context *ctx); 466extern void _intel_flush(struct gl_context * ctx, const char *file, int line); 467 468#define intel_flush(ctx) _intel_flush(ctx, __FILE__, __LINE__) 469 470extern void intelInitDriverFunctions(struct dd_function_table *functions); 471 472void intel_init_syncobj_functions(struct dd_function_table *functions); 473 474 475/* ================================================================ 476 * intel_state.c: 477 */ 478 479#define COMPAREFUNC_ALWAYS 0 480#define COMPAREFUNC_NEVER 0x1 481#define COMPAREFUNC_LESS 0x2 482#define COMPAREFUNC_EQUAL 0x3 483#define COMPAREFUNC_LEQUAL 0x4 484#define COMPAREFUNC_GREATER 0x5 485#define COMPAREFUNC_NOTEQUAL 0x6 486#define COMPAREFUNC_GEQUAL 0x7 487 488#define STENCILOP_KEEP 0 489#define STENCILOP_ZERO 0x1 490#define STENCILOP_REPLACE 0x2 491#define STENCILOP_INCRSAT 0x3 492#define STENCILOP_DECRSAT 0x4 493#define STENCILOP_INCR 0x5 494#define STENCILOP_DECR 0x6 495#define STENCILOP_INVERT 0x7 496 497#define LOGICOP_CLEAR 0 498#define LOGICOP_NOR 0x1 499#define LOGICOP_AND_INV 0x2 500#define LOGICOP_COPY_INV 0x3 501#define LOGICOP_AND_RVRSE 0x4 502#define LOGICOP_INV 0x5 503#define LOGICOP_XOR 0x6 504#define LOGICOP_NAND 0x7 505#define LOGICOP_AND 0x8 506#define LOGICOP_EQUIV 0x9 507#define LOGICOP_NOOP 0xa 508#define LOGICOP_OR_INV 0xb 509#define LOGICOP_COPY 0xc 510#define LOGICOP_OR_RVRSE 0xd 511#define LOGICOP_OR 0xe 512#define LOGICOP_SET 0xf 513 514#define BLENDFACT_ZERO 0x01 515#define BLENDFACT_ONE 0x02 516#define BLENDFACT_SRC_COLR 0x03 517#define BLENDFACT_INV_SRC_COLR 0x04 518#define BLENDFACT_SRC_ALPHA 0x05 519#define BLENDFACT_INV_SRC_ALPHA 0x06 520#define BLENDFACT_DST_ALPHA 0x07 521#define BLENDFACT_INV_DST_ALPHA 0x08 522#define BLENDFACT_DST_COLR 0x09 523#define BLENDFACT_INV_DST_COLR 0x0a 524#define BLENDFACT_SRC_ALPHA_SATURATE 0x0b 525#define BLENDFACT_CONST_COLOR 0x0c 526#define BLENDFACT_INV_CONST_COLOR 0x0d 527#define BLENDFACT_CONST_ALPHA 0x0e 528#define BLENDFACT_INV_CONST_ALPHA 0x0f 529#define BLENDFACT_MASK 0x0f 530 531enum { 532 DRI_CONF_BO_REUSE_DISABLED, 533 DRI_CONF_BO_REUSE_ALL 534}; 535 536extern int intel_translate_shadow_compare_func(GLenum func); 537extern int intel_translate_compare_func(GLenum func); 538extern int intel_translate_stencil_op(GLenum op); 539extern int intel_translate_blend_factor(GLenum factor); 540extern int intel_translate_logic_op(GLenum opcode); 541 542void intel_update_renderbuffers(__DRIcontext *context, 543 __DRIdrawable *drawable); 544void intel_prepare_render(struct intel_context *intel); 545 546void i915_set_buf_info_for_region(uint32_t *state, struct intel_region *region, 547 uint32_t buffer_id); 548void intel_init_texture_formats(struct gl_context *ctx); 549 550/*====================================================================== 551 * Inline conversion functions. 552 * These are better-typed than the macros used previously: 553 */ 554static INLINE struct intel_context * 555intel_context(struct gl_context * ctx) 556{ 557 return (struct intel_context *) ctx; 558} 559 560static INLINE bool 561is_power_of_two(uint32_t value) 562{ 563 return (value & (value - 1)) == 0; 564} 565 566#ifdef __cplusplus 567} 568#endif 569 570#endif 571