[965] Add batchbuffer dumping under INTEL_DEBUG=bat, like 915.
[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 (*reduced_primitive_state)( struct intel_context *intel, GLenum rprim );
113
114 GLboolean (*check_vertex_size)( struct intel_context *intel, GLuint expected );
115
116 void (*invalidate_state)( struct intel_context *intel, GLuint new_state );
117
118 /* Metaops:
119 */
120 void (*install_meta_state)( struct intel_context *intel );
121 void (*leave_meta_state)( struct intel_context *intel );
122
123 void (*meta_draw_region)( struct intel_context *intel,
124 struct intel_region *draw_region,
125 struct intel_region *depth_region );
126
127 void (*meta_color_mask)( struct intel_context *intel,
128 GLboolean );
129
130 void (*meta_stencil_replace)( struct intel_context *intel,
131 GLuint mask,
132 GLuint clear );
133
134 void (*meta_depth_replace)( struct intel_context *intel );
135
136 void (*meta_texture_blend_replace) (struct intel_context * intel);
137
138 void (*meta_no_stencil_write)( struct intel_context *intel );
139 void (*meta_no_depth_write)( struct intel_context *intel );
140 void (*meta_no_texture)( struct intel_context *intel );
141 void (*meta_import_pixel_state) (struct intel_context * intel);
142 void (*meta_frame_buffer_texture)( struct intel_context *intel,
143 GLint xoff, GLint yoff );
144
145 void (*meta_draw_quad)(struct intel_context *intel,
146 GLfloat x0, GLfloat x1,
147 GLfloat y0, GLfloat y1,
148 GLfloat z,
149 GLubyte red, GLubyte green,
150 GLubyte blue, GLubyte alpha,
151 GLfloat s0, GLfloat s1,
152 GLfloat t0, GLfloat t1);
153
154
155
156 } vtbl;
157
158 GLint refcount;
159 GLuint Fallback;
160 GLuint NewGLState;
161
162 GLuint last_swap_fence;
163 GLuint second_last_swap_fence;
164
165 GLuint stats_wm;
166
167 struct intel_batchbuffer *batch;
168
169 GLubyte clear_chan[4];
170 GLuint ClearColor;
171 GLuint ClearDepth;
172
173 GLfloat depth_scale;
174 GLfloat polygon_offset_scale; /* dependent on depth_scale, bpp */
175 GLuint depth_clear_mask;
176 GLuint stencil_clear_mask;
177
178 GLboolean hw_stencil;
179 GLboolean hw_stipple;
180 GLboolean depth_buffer_is_float;
181 GLboolean no_hw;
182 GLboolean no_rast;
183 GLboolean thrashing;
184 GLboolean locked;
185 GLboolean strict_conformance;
186 GLboolean need_flush;
187
188
189
190 /* AGP memory buffer manager:
191 */
192 struct bufmgr *bm;
193
194
195 /* State for intelvb.c and inteltris.c.
196 */
197 GLenum render_primitive;
198 GLenum reduced_primitive;
199
200 struct intel_region *front_region;
201 struct intel_region *back_region;
202 struct intel_region *draw_region;
203 struct intel_region *depth_region;
204
205 /* These refer to the current draw (front vs. back) buffer:
206 */
207 int drawX; /* origin of drawable in draw buffer */
208 int drawY;
209 GLuint numClipRects; /* cliprects for that buffer */
210 drm_clip_rect_t *pClipRects;
211 struct gl_texture_object *frame_buffer_texobj;
212
213 GLboolean scissor;
214 drm_clip_rect_t draw_rect;
215 drm_clip_rect_t scissor_rect;
216
217 drm_context_t hHWContext;
218 drmLock *driHwLock;
219 int driFd;
220
221 __DRIdrawablePrivate *driDrawable;
222 __DRIdrawablePrivate *driReadDrawable;
223 __DRIscreenPrivate *driScreen;
224 intelScreenPrivate *intelScreen;
225 volatile drmI830Sarea *sarea;
226
227 GLuint lastStamp;
228
229 /**
230 * Configuration cache
231 */
232 driOptionCache optionCache;
233
234 /* VBI
235 */
236 GLuint vbl_seq;
237 GLuint vblank_flags;
238
239 int64_t swap_ust;
240 int64_t swap_missed_ust;
241
242 GLuint swap_count;
243 GLuint swap_missed_count;
244 };
245
246 /* These are functions now:
247 */
248 void LOCK_HARDWARE( struct intel_context *intel );
249 void UNLOCK_HARDWARE( struct intel_context *intel );
250
251
252 #define SUBPIXEL_X 0.125
253 #define SUBPIXEL_Y 0.125
254
255 /* ================================================================
256 * Color packing:
257 */
258
259 #define INTEL_PACKCOLOR4444(r,g,b,a) \
260 ((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4))
261
262 #define INTEL_PACKCOLOR1555(r,g,b,a) \
263 ((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
264 ((a) ? 0x8000 : 0))
265
266 #define INTEL_PACKCOLOR565(r,g,b) \
267 ((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
268
269 #define INTEL_PACKCOLOR8888(r,g,b,a) \
270 ((a<<24) | (r<<16) | (g<<8) | b)
271
272
273 #define INTEL_PACKCOLOR(format, r, g, b, a) \
274 (format == DV_PF_555 ? INTEL_PACKCOLOR1555(r,g,b,a) : \
275 (format == DV_PF_565 ? INTEL_PACKCOLOR565(r,g,b) : \
276 (format == DV_PF_8888 ? INTEL_PACKCOLOR8888(r,g,b,a) : \
277 0)))
278
279
280
281 /* ================================================================
282 * From linux kernel i386 header files, copes with odd sizes better
283 * than COPY_DWORDS would:
284 */
285 #if defined(i386) || defined(__i386__)
286 static inline void * __memcpy(void * to, const void * from, size_t n)
287 {
288 int d0, d1, d2;
289 __asm__ __volatile__(
290 "rep ; movsl\n\t"
291 "testb $2,%b4\n\t"
292 "je 1f\n\t"
293 "movsw\n"
294 "1:\ttestb $1,%b4\n\t"
295 "je 2f\n\t"
296 "movsb\n"
297 "2:"
298 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
299 :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
300 : "memory");
301 return (to);
302 }
303 #else
304 #define __memcpy(a,b,c) memcpy(a,b,c)
305 #endif
306
307
308 /* The system memcpy (at least on ubuntu 5.10) has problems copying
309 * to agp (writecombined) memory from a source which isn't 64-byte
310 * aligned - there is a 4x performance falloff.
311 *
312 * The x86 __memcpy is immune to this but is slightly slower
313 * (10%-ish) than the system memcpy.
314 *
315 * The sse_memcpy seems to have a slight cliff at 64/32 bytes, but
316 * isn't much faster than x86_memcpy for agp copies.
317 *
318 * TODO: switch dynamically.
319 */
320 static inline void *do_memcpy( void *dest, const void *src, size_t n )
321 {
322 if ( (((unsigned long)src) & 63) ||
323 (((unsigned long)dest) & 63)) {
324 return __memcpy(dest, src, n);
325 }
326 else
327 return memcpy(dest, src, n);
328 }
329
330
331
332
333
334 /* ================================================================
335 * Debugging:
336 */
337 extern int INTEL_DEBUG;
338
339 #define DEBUG_TEXTURE 0x1
340 #define DEBUG_STATE 0x2
341 #define DEBUG_IOCTL 0x4
342 #define DEBUG_PRIMS 0x8
343 #define DEBUG_VERTS 0x10
344 #define DEBUG_FALLBACKS 0x20
345 #define DEBUG_VERBOSE 0x40
346 #define DEBUG_DRI 0x80
347 #define DEBUG_DMA 0x100
348 #define DEBUG_SANITY 0x200
349 #define DEBUG_SYNC 0x400
350 #define DEBUG_SLEEP 0x800
351 #define DEBUG_PIXEL 0x1000
352 #define DEBUG_STATS 0x2000
353 #define DEBUG_TILE 0x4000
354 #define DEBUG_SINGLE_THREAD 0x8000
355 #define DEBUG_WM 0x10000
356 #define DEBUG_URB 0x20000
357 #define DEBUG_VS 0x40000
358 #define DEBUG_BATCH 0x80000
359
360 /* ================================================================
361 * intel_context.c:
362 */
363
364 extern GLboolean intelInitContext( struct intel_context *intel,
365 const __GLcontextModes *mesaVis,
366 __DRIcontextPrivate *driContextPriv,
367 void *sharedContextPrivate,
368 struct dd_function_table *functions );
369
370 extern void intelGetLock(struct intel_context *intel, GLuint flags);
371
372 extern void intelFinish( GLcontext *ctx );
373 extern void intelFlush( GLcontext *ctx );
374
375 extern void intelInitDriverFunctions( struct dd_function_table *functions );
376
377
378 /* ================================================================
379 * intel_state.c:
380 */
381 extern void intelInitStateFuncs( struct dd_function_table *functions );
382
383 #define COMPAREFUNC_ALWAYS 0
384 #define COMPAREFUNC_NEVER 0x1
385 #define COMPAREFUNC_LESS 0x2
386 #define COMPAREFUNC_EQUAL 0x3
387 #define COMPAREFUNC_LEQUAL 0x4
388 #define COMPAREFUNC_GREATER 0x5
389 #define COMPAREFUNC_NOTEQUAL 0x6
390 #define COMPAREFUNC_GEQUAL 0x7
391
392 #define STENCILOP_KEEP 0
393 #define STENCILOP_ZERO 0x1
394 #define STENCILOP_REPLACE 0x2
395 #define STENCILOP_INCRSAT 0x3
396 #define STENCILOP_DECRSAT 0x4
397 #define STENCILOP_INCR 0x5
398 #define STENCILOP_DECR 0x6
399 #define STENCILOP_INVERT 0x7
400
401 #define LOGICOP_CLEAR 0
402 #define LOGICOP_NOR 0x1
403 #define LOGICOP_AND_INV 0x2
404 #define LOGICOP_COPY_INV 0x3
405 #define LOGICOP_AND_RVRSE 0x4
406 #define LOGICOP_INV 0x5
407 #define LOGICOP_XOR 0x6
408 #define LOGICOP_NAND 0x7
409 #define LOGICOP_AND 0x8
410 #define LOGICOP_EQUIV 0x9
411 #define LOGICOP_NOOP 0xa
412 #define LOGICOP_OR_INV 0xb
413 #define LOGICOP_COPY 0xc
414 #define LOGICOP_OR_RVRSE 0xd
415 #define LOGICOP_OR 0xe
416 #define LOGICOP_SET 0xf
417
418 #define BLENDFACT_ZERO 0x01
419 #define BLENDFACT_ONE 0x02
420 #define BLENDFACT_SRC_COLR 0x03
421 #define BLENDFACT_INV_SRC_COLR 0x04
422 #define BLENDFACT_SRC_ALPHA 0x05
423 #define BLENDFACT_INV_SRC_ALPHA 0x06
424 #define BLENDFACT_DST_ALPHA 0x07
425 #define BLENDFACT_INV_DST_ALPHA 0x08
426 #define BLENDFACT_DST_COLR 0x09
427 #define BLENDFACT_INV_DST_COLR 0x0a
428 #define BLENDFACT_SRC_ALPHA_SATURATE 0x0b
429 #define BLENDFACT_CONST_COLOR 0x0c
430 #define BLENDFACT_INV_CONST_COLOR 0x0d
431 #define BLENDFACT_CONST_ALPHA 0x0e
432 #define BLENDFACT_INV_CONST_ALPHA 0x0f
433 #define BLENDFACT_MASK 0x0f
434
435 extern int intel_translate_shadow_compare_func( GLenum func );
436 extern int intel_translate_compare_func( GLenum func );
437 extern int intel_translate_stencil_op( GLenum op );
438 extern int intel_translate_blend_factor( GLenum factor );
439 extern int intel_translate_logic_op( GLenum opcode );
440
441
442 /* ================================================================
443 * intel_buffers.c:
444 */
445 void intelInitBufferFuncs( struct dd_function_table *functions );
446
447 struct intel_region *intel_readbuf_region( struct intel_context *intel );
448 struct intel_region *intel_drawbuf_region( struct intel_context *intel );
449
450 extern void intelWindowMoved( struct intel_context *intel );
451
452 extern GLboolean intel_intersect_cliprects( drm_clip_rect_t *dest,
453 const drm_clip_rect_t *a,
454 const drm_clip_rect_t *b );
455
456
457 /* ================================================================
458 * intel_pixel_copy.c:
459 */
460 void intelCopyPixels(GLcontext * ctx,
461 GLint srcx, GLint srcy,
462 GLsizei width, GLsizei height,
463 GLint destx, GLint desty, GLenum type);
464
465 GLboolean intel_check_blit_fragment_ops(GLcontext * ctx);
466
467 void intelBitmap(GLcontext * ctx,
468 GLint x, GLint y,
469 GLsizei width, GLsizei height,
470 const struct gl_pixelstore_attrib *unpack,
471 const GLubyte * pixels);
472
473 void intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging);
474 #define _NEW_WINDOW_POS 0x40000000
475
476
477 /*======================================================================
478 * Inline conversion functions.
479 * These are better-typed than the macros used previously:
480 */
481 static inline struct intel_context *intel_context( GLcontext *ctx )
482 {
483 return (struct intel_context *)ctx;
484 }
485
486 static inline struct intel_texture_object *intel_texture_object( struct gl_texture_object *obj )
487 {
488 return (struct intel_texture_object *)obj;
489 }
490
491 static inline struct intel_texture_image *intel_texture_image( struct gl_texture_image *img )
492 {
493 return (struct intel_texture_image *)img;
494 }
495
496 #endif
497