intel_context.h revision fcd1e9dad6949e02380593a166432dbac311c80e
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 "mtypes.h" 34#include "drm.h" 35#include "mm.h" 36#include "texmem.h" 37#include "dri_bufmgr.h" 38 39#include "intel_screen.h" 40#include "intel_tex_obj.h" 41#include "i915_drm.h" 42#include "i830_common.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 53struct intel_region; 54struct intel_context; 55 56typedef void (*intel_tri_func) (struct intel_context *, intelVertex *, 57 intelVertex *, intelVertex *); 58typedef void (*intel_line_func) (struct intel_context *, intelVertex *, 59 intelVertex *); 60typedef void (*intel_point_func) (struct intel_context *, intelVertex *); 61 62#define INTEL_FALLBACK_DRAW_BUFFER 0x1 63#define INTEL_FALLBACK_READ_BUFFER 0x2 64#define INTEL_FALLBACK_DEPTH_BUFFER 0x4 65#define INTEL_FALLBACK_STENCIL_BUFFER 0x8 66#define INTEL_FALLBACK_USER 0x10 67#define INTEL_FALLBACK_RENDERMODE 0x20 68 69extern void intelFallback(struct intel_context *intel, GLuint bit, 70 GLboolean mode); 71#define FALLBACK( intel, bit, mode ) intelFallback( intel, bit, mode ) 72 73 74#define INTEL_WRITE_PART 0x1 75#define INTEL_WRITE_FULL 0x2 76#define INTEL_READ 0x4 77 78#define INTEL_MAX_FIXUP 64 79 80struct intel_context 81{ 82 GLcontext ctx; /* the parent class */ 83 84 struct 85 { 86 void (*destroy) (struct intel_context * intel); 87 void (*emit_state) (struct intel_context * intel); 88 void (*lost_hardware) (struct intel_context * intel); 89 void (*update_texture_state) (struct intel_context * intel); 90 91 void (*render_start) (struct intel_context * intel); 92 void (*render_prevalidate) (struct intel_context * intel); 93 void (*set_draw_region) (struct intel_context * intel, 94 struct intel_region * draw_region, 95 struct intel_region * depth_region); 96 97 GLuint(*flush_cmd) (void); 98 99 void (*reduced_primitive_state) (struct intel_context * intel, 100 GLenum rprim); 101 102 GLboolean(*check_vertex_size) (struct intel_context * intel, 103 GLuint expected); 104 105 106 /* Metaops: 107 */ 108 void (*install_meta_state) (struct intel_context * intel); 109 void (*leave_meta_state) (struct intel_context * intel); 110 111 void (*meta_draw_region) (struct intel_context * intel, 112 struct intel_region * draw_region, 113 struct intel_region * depth_region); 114 115 void (*meta_draw_quad)(struct intel_context *intel, 116 GLfloat x0, GLfloat x1, 117 GLfloat y0, GLfloat y1, 118 GLfloat z, 119 GLuint color, /* ARGB32 */ 120 GLfloat s0, GLfloat s1, 121 GLfloat t0, GLfloat t1); 122 123 void (*meta_color_mask) (struct intel_context * intel, GLboolean); 124 125 void (*meta_stencil_replace) (struct intel_context * intel, 126 GLuint mask, GLuint clear); 127 128 void (*meta_depth_replace) (struct intel_context * intel); 129 130 void (*meta_texture_blend_replace) (struct intel_context * intel); 131 132 void (*meta_no_stencil_write) (struct intel_context * intel); 133 void (*meta_no_depth_write) (struct intel_context * intel); 134 void (*meta_no_texture) (struct intel_context * intel); 135 136 void (*meta_import_pixel_state) (struct intel_context * intel); 137 138 GLboolean(*meta_tex_rect_source) (struct intel_context * intel, 139 dri_bo * buffer, 140 GLuint offset, 141 GLuint pitch, 142 GLuint height, 143 GLenum format, GLenum type); 144 145 void (*assert_not_dirty) (struct intel_context *intel); 146 147 void (*debug_batch)(struct intel_context *intel); 148 } vtbl; 149 150 GLint refcount; 151 GLuint Fallback; 152 GLuint NewGLState; 153 154 dri_bufmgr *bufmgr; 155 unsigned int maxBatchSize; 156 157 struct intel_region *front_region; 158 struct intel_region *back_region; 159 struct intel_region *third_region; 160 struct intel_region *depth_region; 161 162 /** 163 * This value indicates that the kernel memory manager is being used 164 * instead of the fake client-side memory manager. 165 */ 166 GLboolean ttm; 167 168 dri_fence *last_swap_fence; 169 dri_fence *first_swap_fence; 170 171 struct intel_batchbuffer *batch; 172 unsigned batch_id; 173 GLuint last_state_batch_id; 174 175 struct 176 { 177 GLuint id; 178 GLuint primitive; 179 GLubyte *start_ptr; 180 void (*flush) (struct intel_context *); 181 } prim; 182 183 GLboolean locked; 184 char *prevLockFile; 185 int prevLockLine; 186 187 GLuint ClearColor565; 188 GLuint ClearColor8888; 189 190 /* Offsets of fields within the current vertex: 191 */ 192 GLuint coloroffset; 193 GLuint specoffset; 194 GLuint wpos_offset; 195 GLuint wpos_size; 196 197 struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX]; 198 GLuint vertex_attr_count; 199 200 GLfloat polygon_offset_scale; /* dependent on depth_scale, bpp */ 201 202 GLboolean hw_stipple; 203 GLboolean strict_conformance; 204 205 /* State for intelvb.c and inteltris.c. 206 */ 207 GLuint RenderIndex; 208 GLmatrix ViewportMatrix; 209 GLenum render_primitive; 210 GLenum reduced_primitive; 211 GLuint vertex_size; 212 GLubyte *verts; /* points to tnl->clipspace.vertex_buf */ 213 214 /* Fallback rasterization functions 215 */ 216 intel_point_func draw_point; 217 intel_line_func draw_line; 218 intel_tri_func draw_tri; 219 220 /* These refer to the current drawing buffer: 221 */ 222 int drawX, drawY; /**< origin of drawing area within region */ 223 GLuint numClipRects; /**< cliprects for drawing */ 224 drm_clip_rect_t *pClipRects; 225 drm_clip_rect_t fboRect; /**< cliprect for FBO rendering */ 226 227 int perf_boxes; 228 229 GLuint do_usleeps; 230 int do_irqs; 231 GLuint irqsEmitted; 232 233 drm_context_t hHWContext; 234 drmLock *driHwLock; 235 int driFd; 236 237 __DRIdrawablePrivate *driDrawable; 238 __DRIscreenPrivate *driScreen; 239 intelScreenPrivate *intelScreen; 240 drmI830Sarea *sarea; 241 242 GLuint lastStamp; 243 244 /** 245 * Configuration cache 246 */ 247 driOptionCache optionCache; 248 249 /* Last seen width/height of the screen */ 250 int width; 251 int height; 252}; 253 254/* These are functions now: 255 */ 256void LOCK_HARDWARE( struct intel_context *intel ); 257void UNLOCK_HARDWARE( struct intel_context *intel ); 258 259extern char *__progname; 260 261 262#define SUBPIXEL_X 0.125 263#define SUBPIXEL_Y 0.125 264 265#define ALIGN(value, alignment) ((value + alignment - 1) & ~(alignment - 1)) 266 267#define INTEL_FIREVERTICES(intel) \ 268do { \ 269 if ((intel)->prim.flush) \ 270 (intel)->prim.flush(intel); \ 271} while (0) 272 273/* ================================================================ 274 * Color packing: 275 */ 276 277#define INTEL_PACKCOLOR4444(r,g,b,a) \ 278 ((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4)) 279 280#define INTEL_PACKCOLOR1555(r,g,b,a) \ 281 ((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \ 282 ((a) ? 0x8000 : 0)) 283 284#define INTEL_PACKCOLOR565(r,g,b) \ 285 ((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3)) 286 287#define INTEL_PACKCOLOR8888(r,g,b,a) \ 288 ((a<<24) | (r<<16) | (g<<8) | b) 289 290 291 292/* ================================================================ 293 * From linux kernel i386 header files, copes with odd sizes better 294 * than COPY_DWORDS would: 295 * XXX Put this in src/mesa/main/imports.h ??? 296 */ 297#if defined(i386) || defined(__i386__) 298static INLINE void * 299__memcpy(void *to, const void *from, size_t n) 300{ 301 int d0, d1, d2; 302 __asm__ __volatile__("rep ; movsl\n\t" 303 "testb $2,%b4\n\t" 304 "je 1f\n\t" 305 "movsw\n" 306 "1:\ttestb $1,%b4\n\t" 307 "je 2f\n\t" 308 "movsb\n" "2:":"=&c"(d0), "=&D"(d1), "=&S"(d2) 309 :"0"(n / 4), "q"(n), "1"((long) to), "2"((long) from) 310 :"memory"); 311 return (to); 312} 313#else 314#define __memcpy(a,b,c) memcpy(a,b,c) 315#endif 316 317 318 319/* ================================================================ 320 * Debugging: 321 */ 322#define DO_DEBUG 1 323#if DO_DEBUG 324extern int INTEL_DEBUG; 325#else 326#define INTEL_DEBUG 0 327#endif 328 329#define DEBUG_TEXTURE 0x1 330#define DEBUG_STATE 0x2 331#define DEBUG_IOCTL 0x4 332#define DEBUG_BLIT 0x8 333#define DEBUG_MIPTREE 0x10 334#define DEBUG_FALLBACKS 0x20 335#define DEBUG_VERBOSE 0x40 336#define DEBUG_BATCH 0x80 337#define DEBUG_PIXEL 0x100 338#define DEBUG_BUFMGR 0x200 339#define DEBUG_REGION 0x400 340#define DEBUG_FBO 0x800 341#define DEBUG_LOCK 0x1000 342#define DEBUG_SYNC 0x2000 343 344#define DBG(...) do { if (INTEL_DEBUG & FILE_DEBUG_FLAG) _mesa_printf(__VA_ARGS__); } while(0) 345 346 347#define PCI_CHIP_845_G 0x2562 348#define PCI_CHIP_I830_M 0x3577 349#define PCI_CHIP_I855_GM 0x3582 350#define PCI_CHIP_I865_G 0x2572 351#define PCI_CHIP_I915_G 0x2582 352#define PCI_CHIP_I915_GM 0x2592 353#define PCI_CHIP_I945_G 0x2772 354#define PCI_CHIP_I945_GM 0x27A2 355#define PCI_CHIP_I945_GME 0x27AE 356#define PCI_CHIP_G33_G 0x29C2 357#define PCI_CHIP_Q35_G 0x29B2 358#define PCI_CHIP_Q33_G 0x29D2 359 360 361/* ================================================================ 362 * intel_context.c: 363 */ 364 365extern GLboolean intelInitContext(struct intel_context *intel, 366 const __GLcontextModes * mesaVis, 367 __DRIcontextPrivate * driContextPriv, 368 void *sharedContextPrivate, 369 struct dd_function_table *functions); 370 371extern void intelGetLock(struct intel_context *intel, GLuint flags); 372 373extern void intelFinish(GLcontext * ctx); 374extern void intelFlush(GLcontext * ctx); 375 376extern void intelInitDriverFunctions(struct dd_function_table *functions); 377 378 379/* ================================================================ 380 * intel_state.c: 381 */ 382extern void intelInitStateFuncs(struct dd_function_table *functions); 383 384#define COMPAREFUNC_ALWAYS 0 385#define COMPAREFUNC_NEVER 0x1 386#define COMPAREFUNC_LESS 0x2 387#define COMPAREFUNC_EQUAL 0x3 388#define COMPAREFUNC_LEQUAL 0x4 389#define COMPAREFUNC_GREATER 0x5 390#define COMPAREFUNC_NOTEQUAL 0x6 391#define COMPAREFUNC_GEQUAL 0x7 392 393#define STENCILOP_KEEP 0 394#define STENCILOP_ZERO 0x1 395#define STENCILOP_REPLACE 0x2 396#define STENCILOP_INCRSAT 0x3 397#define STENCILOP_DECRSAT 0x4 398#define STENCILOP_INCR 0x5 399#define STENCILOP_DECR 0x6 400#define STENCILOP_INVERT 0x7 401 402#define LOGICOP_CLEAR 0 403#define LOGICOP_NOR 0x1 404#define LOGICOP_AND_INV 0x2 405#define LOGICOP_COPY_INV 0x3 406#define LOGICOP_AND_RVRSE 0x4 407#define LOGICOP_INV 0x5 408#define LOGICOP_XOR 0x6 409#define LOGICOP_NAND 0x7 410#define LOGICOP_AND 0x8 411#define LOGICOP_EQUIV 0x9 412#define LOGICOP_NOOP 0xa 413#define LOGICOP_OR_INV 0xb 414#define LOGICOP_COPY 0xc 415#define LOGICOP_OR_RVRSE 0xd 416#define LOGICOP_OR 0xe 417#define LOGICOP_SET 0xf 418 419#define BLENDFACT_ZERO 0x01 420#define BLENDFACT_ONE 0x02 421#define BLENDFACT_SRC_COLR 0x03 422#define BLENDFACT_INV_SRC_COLR 0x04 423#define BLENDFACT_SRC_ALPHA 0x05 424#define BLENDFACT_INV_SRC_ALPHA 0x06 425#define BLENDFACT_DST_ALPHA 0x07 426#define BLENDFACT_INV_DST_ALPHA 0x08 427#define BLENDFACT_DST_COLR 0x09 428#define BLENDFACT_INV_DST_COLR 0x0a 429#define BLENDFACT_SRC_ALPHA_SATURATE 0x0b 430#define BLENDFACT_CONST_COLOR 0x0c 431#define BLENDFACT_INV_CONST_COLOR 0x0d 432#define BLENDFACT_CONST_ALPHA 0x0e 433#define BLENDFACT_INV_CONST_ALPHA 0x0f 434#define BLENDFACT_MASK 0x0f 435 436extern int intel_translate_compare_func(GLenum func); 437extern int intel_translate_stencil_op(GLenum op); 438extern int intel_translate_blend_factor(GLenum factor); 439extern int intel_translate_logic_op(GLenum opcode); 440 441 442/*====================================================================== 443 * Inline conversion functions. 444 * These are better-typed than the macros used previously: 445 */ 446static INLINE struct intel_context * 447intel_context(GLcontext * ctx) 448{ 449 return (struct intel_context *) ctx; 450} 451 452#endif 453