more tips, validation info
[mesa.git] / src / mesa / drivers / dri / i965 / intel_context.h
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 "texmem.h"
36
37 #include "intel_screen.h"
38 #include "i830_common.h"
39 #include "tnl/t_vertex.h"
40
41 #define TAG(x) intel##x
42 #include "tnl_dd/t_dd_vertex.h"
43 #undef TAG
44
45 #define DV_PF_555 (1<<8)
46 #define DV_PF_565 (2<<8)
47 #define DV_PF_8888 (3<<8)
48
49 struct intel_region;
50 struct intel_context;
51
52 typedef void (*intel_tri_func)(struct intel_context *, intelVertex *, intelVertex *,
53 intelVertex *);
54 typedef void (*intel_line_func)(struct intel_context *, intelVertex *, intelVertex *);
55 typedef void (*intel_point_func)(struct intel_context *, intelVertex *);
56
57 #define INTEL_FALLBACK_DRAW_BUFFER 0x1
58 #define INTEL_FALLBACK_READ_BUFFER 0x2
59 #define INTEL_FALLBACK_USER 0x4
60 #define INTEL_FALLBACK_RENDERMODE 0x8
61 #define INTEL_FALLBACK_TEXTURE 0x10
62
63 extern void intelFallback( struct intel_context *intel, GLuint bit, GLboolean mode );
64 #define FALLBACK( intel, bit, mode ) intelFallback( intel, bit, mode )
65
66
67
68 struct intel_texture_object
69 {
70 struct gl_texture_object base; /* The "parent" object */
71
72 /* The mipmap tree must include at least these levels once
73 * validated:
74 */
75 GLuint firstLevel;
76 GLuint lastLevel;
77
78 GLuint dirty_images[6];
79 GLuint dirty;
80
81 /* On validation any active images held in main memory or in other
82 * regions will be copied to this region and the old storage freed.
83 */
84 struct intel_mipmap_tree *mt;
85 };
86
87
88
89 struct intel_context
90 {
91 GLcontext ctx; /* the parent class */
92
93 struct {
94 void (*destroy)( struct intel_context *intel );
95 void (*emit_state)( struct intel_context *intel );
96 void (*emit_invarient_state)( struct intel_context *intel );
97 void (*lost_hardware)( struct intel_context *intel );
98 void (*note_fence)( struct intel_context *intel, GLuint fence );
99 void (*note_unlock)( struct intel_context *intel );
100 void (*update_texture_state)( struct intel_context *intel );
101
102 void (*render_start)( struct intel_context *intel );
103 void (*set_draw_region)( struct intel_context *intel,
104 struct intel_region *draw_region,
105 struct intel_region *depth_region );
106
107 GLuint (*flush_cmd)( void );
108
109 void (*emit_flush)( struct intel_context *intel,
110 GLuint unused );
111
112 void (*aub_commands)( struct intel_context *intel,
113 GLuint offset,
114 const void *buf,
115 GLuint sz );
116 void (*aub_dump_bmp)( struct intel_context *intel, GLuint buffer );
117 void (*aub_wrap)( struct intel_context *intel );
118 void (*aub_gtt_data)( struct intel_context *intel,
119 GLuint offset,
120 const void *src,
121 GLuint size,
122 GLuint aubtype,
123 GLuint aubsubtype);
124
125
126 void (*reduced_primitive_state)( struct intel_context *intel, GLenum rprim );
127
128 GLboolean (*check_vertex_size)( struct intel_context *intel, GLuint expected );
129
130 void (*invalidate_state)( struct intel_context *intel, GLuint new_state );
131
132 /* Metaops:
133 */
134 void (*install_meta_state)( struct intel_context *intel );
135 void (*leave_meta_state)( struct intel_context *intel );
136
137 void (*meta_draw_region)( struct intel_context *intel,
138 struct intel_region *draw_region,
139 struct intel_region *depth_region );
140
141 void (*meta_color_mask)( struct intel_context *intel,
142 GLboolean );
143
144 void (*meta_stencil_replace)( struct intel_context *intel,
145 GLuint mask,
146 GLuint clear );
147
148 void (*meta_depth_replace)( struct intel_context *intel );
149
150 void (*meta_texture_blend_replace) (struct intel_context * intel);
151
152 void (*meta_no_stencil_write)( struct intel_context *intel );
153 void (*meta_no_depth_write)( struct intel_context *intel );
154 void (*meta_no_texture)( struct intel_context *intel );
155 void (*meta_import_pixel_state) (struct intel_context * intel);
156 void (*meta_frame_buffer_texture)( struct intel_context *intel,
157 GLint xoff, GLint yoff );
158
159 void (*meta_draw_quad)(struct intel_context *intel,
160 GLfloat x0, GLfloat x1,
161 GLfloat y0, GLfloat y1,
162 GLfloat z,
163 GLubyte red, GLubyte green,
164 GLubyte blue, GLubyte alpha,
165 GLfloat s0, GLfloat s1,
166 GLfloat t0, GLfloat t1);
167
168
169
170 } vtbl;
171
172 GLint refcount;
173 GLuint Fallback;
174 GLuint NewGLState;
175
176 GLuint last_swap_fence;
177 GLuint second_last_swap_fence;
178
179 GLboolean aub_wrap;
180 GLuint stats_wm;
181
182 struct intel_batchbuffer *batch;
183
184 GLubyte clear_chan[4];
185 GLuint ClearColor;
186 GLuint ClearDepth;
187
188 GLfloat depth_scale;
189 GLfloat polygon_offset_scale; /* dependent on depth_scale, bpp */
190 GLuint depth_clear_mask;
191 GLuint stencil_clear_mask;
192
193 GLboolean hw_stencil;
194 GLboolean hw_stipple;
195 GLboolean depth_buffer_is_float;
196 GLboolean no_hw;
197 GLboolean no_rast;
198 GLboolean thrashing;
199 GLboolean locked;
200 GLboolean strict_conformance;
201 GLboolean need_flush;
202
203
204
205 /* AGP memory buffer manager:
206 */
207 struct bufmgr *bm;
208
209
210 /* State for intelvb.c and inteltris.c.
211 */
212 GLenum render_primitive;
213 GLenum reduced_primitive;
214
215 struct intel_region *front_region;
216 struct intel_region *back_region;
217 struct intel_region *draw_region;
218 struct intel_region *depth_region;
219
220 /* These refer to the current draw (front vs. back) buffer:
221 */
222 int drawX; /* origin of drawable in draw buffer */
223 int drawY;
224 GLuint numClipRects; /* cliprects for that buffer */
225 drm_clip_rect_t *pClipRects;
226 struct gl_texture_object *frame_buffer_texobj;
227
228 GLboolean scissor;
229 drm_clip_rect_t draw_rect;
230 drm_clip_rect_t scissor_rect;
231
232 drm_context_t hHWContext;
233 drmLock *driHwLock;
234 int driFd;
235
236 __DRIdrawablePrivate *driDrawable;
237 __DRIscreenPrivate *driScreen;
238 intelScreenPrivate *intelScreen;
239 volatile drmI830Sarea *sarea;
240
241 FILE *aub_file;
242
243 GLuint lastStamp;
244
245 /**
246 * Configuration cache
247 */
248 driOptionCache optionCache;
249
250 /* VBI
251 */
252 GLuint vbl_seq;
253 GLuint vblank_flags;
254
255 int64_t swap_ust;
256 int64_t swap_missed_ust;
257
258 GLuint swap_count;
259 GLuint swap_missed_count;
260 };
261
262 /* These are functions now:
263 */
264 void LOCK_HARDWARE( struct intel_context *intel );
265 void UNLOCK_HARDWARE( struct intel_context *intel );
266
267
268 #define SUBPIXEL_X 0.125
269 #define SUBPIXEL_Y 0.125
270
271 /* ================================================================
272 * Color packing:
273 */
274
275 #define INTEL_PACKCOLOR4444(r,g,b,a) \
276 ((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4))
277
278 #define INTEL_PACKCOLOR1555(r,g,b,a) \
279 ((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
280 ((a) ? 0x8000 : 0))
281
282 #define INTEL_PACKCOLOR565(r,g,b) \
283 ((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
284
285 #define INTEL_PACKCOLOR8888(r,g,b,a) \
286 ((a<<24) | (r<<16) | (g<<8) | b)
287
288
289 #define INTEL_PACKCOLOR(format, r, g, b, a) \
290 (format == DV_PF_555 ? INTEL_PACKCOLOR1555(r,g,b,a) : \
291 (format == DV_PF_565 ? INTEL_PACKCOLOR565(r,g,b) : \
292 (format == DV_PF_8888 ? INTEL_PACKCOLOR8888(r,g,b,a) : \
293 0)))
294
295
296
297 /* ================================================================
298 * From linux kernel i386 header files, copes with odd sizes better
299 * than COPY_DWORDS would:
300 */
301 #if defined(i386) || defined(__i386__)
302 static inline void * __memcpy(void * to, const void * from, size_t n)
303 {
304 int d0, d1, d2;
305 __asm__ __volatile__(
306 "rep ; movsl\n\t"
307 "testb $2,%b4\n\t"
308 "je 1f\n\t"
309 "movsw\n"
310 "1:\ttestb $1,%b4\n\t"
311 "je 2f\n\t"
312 "movsb\n"
313 "2:"
314 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
315 :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
316 : "memory");
317 return (to);
318 }
319 #else
320 #define __memcpy(a,b,c) memcpy(a,b,c)
321 #endif
322
323
324 /* The system memcpy (at least on ubuntu 5.10) has problems copying
325 * to agp (writecombined) memory from a source which isn't 64-byte
326 * aligned - there is a 4x performance falloff.
327 *
328 * The x86 __memcpy is immune to this but is slightly slower
329 * (10%-ish) than the system memcpy.
330 *
331 * The sse_memcpy seems to have a slight cliff at 64/32 bytes, but
332 * isn't much faster than x86_memcpy for agp copies.
333 *
334 * TODO: switch dynamically.
335 */
336 static inline void *do_memcpy( void *dest, const void *src, size_t n )
337 {
338 if ( (((unsigned long)src) & 63) ||
339 (((unsigned long)dest) & 63)) {
340 return __memcpy(dest, src, n);
341 }
342 else
343 return memcpy(dest, src, n);
344 }
345
346
347
348
349
350 /* ================================================================
351 * Debugging:
352 */
353 extern int INTEL_DEBUG;
354
355 #define DEBUG_TEXTURE 0x1
356 #define DEBUG_STATE 0x2
357 #define DEBUG_IOCTL 0x4
358 #define DEBUG_PRIMS 0x8
359 #define DEBUG_VERTS 0x10
360 #define DEBUG_FALLBACKS 0x20
361 #define DEBUG_VERBOSE 0x40
362 #define DEBUG_DRI 0x80
363 #define DEBUG_DMA 0x100
364 #define DEBUG_SANITY 0x200
365 #define DEBUG_SYNC 0x400
366 #define DEBUG_SLEEP 0x800
367 #define DEBUG_PIXEL 0x1000
368 #define DEBUG_STATS 0x2000
369 #define DEBUG_TILE 0x4000
370 #define DEBUG_SINGLE_THREAD 0x8000
371 #define DEBUG_WM 0x10000
372 #define DEBUG_URB 0x20000
373 #define DEBUG_VS 0x40000
374
375
376 #define PCI_CHIP_845_G 0x2562
377 #define PCI_CHIP_I830_M 0x3577
378 #define PCI_CHIP_I855_GM 0x3582
379 #define PCI_CHIP_I865_G 0x2572
380 #define PCI_CHIP_I915_G 0x2582
381 #define PCI_CHIP_I915_GM 0x2592
382 #define PCI_CHIP_I945_G 0x2772
383 #define PCI_CHIP_I965_G 0x29A2
384 #define PCI_CHIP_I965_Q 0x2992
385 #define PCI_CHIP_I965_G_1 0x2982
386 #define PCI_CHIP_I946_GZ 0x2972
387
388
389 /* ================================================================
390 * intel_context.c:
391 */
392
393 extern GLboolean intelInitContext( struct intel_context *intel,
394 const __GLcontextModes *mesaVis,
395 __DRIcontextPrivate *driContextPriv,
396 void *sharedContextPrivate,
397 struct dd_function_table *functions );
398
399 extern void intelGetLock(struct intel_context *intel, GLuint flags);
400
401 extern void intelInitState( GLcontext *ctx );
402 extern void intelFinish( GLcontext *ctx );
403 extern void intelFlush( GLcontext *ctx );
404
405 extern void intelInitDriverFunctions( struct dd_function_table *functions );
406
407
408 /* ================================================================
409 * intel_state.c:
410 */
411 extern void intelInitStateFuncs( struct dd_function_table *functions );
412
413 #define COMPAREFUNC_ALWAYS 0
414 #define COMPAREFUNC_NEVER 0x1
415 #define COMPAREFUNC_LESS 0x2
416 #define COMPAREFUNC_EQUAL 0x3
417 #define COMPAREFUNC_LEQUAL 0x4
418 #define COMPAREFUNC_GREATER 0x5
419 #define COMPAREFUNC_NOTEQUAL 0x6
420 #define COMPAREFUNC_GEQUAL 0x7
421
422 #define STENCILOP_KEEP 0
423 #define STENCILOP_ZERO 0x1
424 #define STENCILOP_REPLACE 0x2
425 #define STENCILOP_INCRSAT 0x3
426 #define STENCILOP_DECRSAT 0x4
427 #define STENCILOP_INCR 0x5
428 #define STENCILOP_DECR 0x6
429 #define STENCILOP_INVERT 0x7
430
431 #define LOGICOP_CLEAR 0
432 #define LOGICOP_NOR 0x1
433 #define LOGICOP_AND_INV 0x2
434 #define LOGICOP_COPY_INV 0x3
435 #define LOGICOP_AND_RVRSE 0x4
436 #define LOGICOP_INV 0x5
437 #define LOGICOP_XOR 0x6
438 #define LOGICOP_NAND 0x7
439 #define LOGICOP_AND 0x8
440 #define LOGICOP_EQUIV 0x9
441 #define LOGICOP_NOOP 0xa
442 #define LOGICOP_OR_INV 0xb
443 #define LOGICOP_COPY 0xc
444 #define LOGICOP_OR_RVRSE 0xd
445 #define LOGICOP_OR 0xe
446 #define LOGICOP_SET 0xf
447
448 #define BLENDFACT_ZERO 0x01
449 #define BLENDFACT_ONE 0x02
450 #define BLENDFACT_SRC_COLR 0x03
451 #define BLENDFACT_INV_SRC_COLR 0x04
452 #define BLENDFACT_SRC_ALPHA 0x05
453 #define BLENDFACT_INV_SRC_ALPHA 0x06
454 #define BLENDFACT_DST_ALPHA 0x07
455 #define BLENDFACT_INV_DST_ALPHA 0x08
456 #define BLENDFACT_DST_COLR 0x09
457 #define BLENDFACT_INV_DST_COLR 0x0a
458 #define BLENDFACT_SRC_ALPHA_SATURATE 0x0b
459 #define BLENDFACT_CONST_COLOR 0x0c
460 #define BLENDFACT_INV_CONST_COLOR 0x0d
461 #define BLENDFACT_CONST_ALPHA 0x0e
462 #define BLENDFACT_INV_CONST_ALPHA 0x0f
463 #define BLENDFACT_MASK 0x0f
464
465
466 extern int intel_translate_compare_func( GLenum func );
467 extern int intel_translate_stencil_op( GLenum op );
468 extern int intel_translate_blend_factor( GLenum factor );
469 extern int intel_translate_logic_op( GLenum opcode );
470
471
472 /* ================================================================
473 * intel_buffers.c:
474 */
475 void intelInitBufferFuncs( struct dd_function_table *functions );
476
477 struct intel_region *intel_readbuf_region( struct intel_context *intel );
478 struct intel_region *intel_drawbuf_region( struct intel_context *intel );
479
480 extern void intelWindowMoved( struct intel_context *intel );
481
482 extern GLboolean intel_intersect_cliprects( drm_clip_rect_t *dest,
483 const drm_clip_rect_t *a,
484 const drm_clip_rect_t *b );
485
486
487 /* ================================================================
488 * intel_pixel_copy.c:
489 */
490 void intelCopyPixels(GLcontext * ctx,
491 GLint srcx, GLint srcy,
492 GLsizei width, GLsizei height,
493 GLint destx, GLint desty, GLenum type);
494
495 GLboolean intel_check_blit_fragment_ops(GLcontext * ctx);
496
497 void intelBitmap(GLcontext * ctx,
498 GLint x, GLint y,
499 GLsizei width, GLsizei height,
500 const struct gl_pixelstore_attrib *unpack,
501 const GLubyte * pixels);
502
503 void intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging);
504 #define _NEW_WINDOW_POS 0x40000000
505
506
507 /*======================================================================
508 * Inline conversion functions.
509 * These are better-typed than the macros used previously:
510 */
511 static inline struct intel_context *intel_context( GLcontext *ctx )
512 {
513 return (struct intel_context *)ctx;
514 }
515
516 static inline struct intel_texture_object *intel_texture_object( struct gl_texture_object *obj )
517 {
518 return (struct intel_texture_object *)obj;
519 }
520
521 static inline struct intel_texture_image *intel_texture_image( struct gl_texture_image *img )
522 {
523 return (struct intel_texture_image *)img;
524 }
525
526 #endif
527