Merge git://proxy01.pd.intel.com:9419/git/mesa/mesa into crestline
[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 #define PCI_CHIP_I965_GM 0x2A02
388
389
390 /* ================================================================
391 * intel_context.c:
392 */
393
394 extern GLboolean intelInitContext( struct intel_context *intel,
395 const __GLcontextModes *mesaVis,
396 __DRIcontextPrivate *driContextPriv,
397 void *sharedContextPrivate,
398 struct dd_function_table *functions );
399
400 extern void intelGetLock(struct intel_context *intel, GLuint flags);
401
402 extern void intelInitState( GLcontext *ctx );
403 extern void intelFinish( GLcontext *ctx );
404 extern void intelFlush( GLcontext *ctx );
405
406 extern void intelInitDriverFunctions( struct dd_function_table *functions );
407
408
409 /* ================================================================
410 * intel_state.c:
411 */
412 extern void intelInitStateFuncs( struct dd_function_table *functions );
413
414 #define COMPAREFUNC_ALWAYS 0
415 #define COMPAREFUNC_NEVER 0x1
416 #define COMPAREFUNC_LESS 0x2
417 #define COMPAREFUNC_EQUAL 0x3
418 #define COMPAREFUNC_LEQUAL 0x4
419 #define COMPAREFUNC_GREATER 0x5
420 #define COMPAREFUNC_NOTEQUAL 0x6
421 #define COMPAREFUNC_GEQUAL 0x7
422
423 #define STENCILOP_KEEP 0
424 #define STENCILOP_ZERO 0x1
425 #define STENCILOP_REPLACE 0x2
426 #define STENCILOP_INCRSAT 0x3
427 #define STENCILOP_DECRSAT 0x4
428 #define STENCILOP_INCR 0x5
429 #define STENCILOP_DECR 0x6
430 #define STENCILOP_INVERT 0x7
431
432 #define LOGICOP_CLEAR 0
433 #define LOGICOP_NOR 0x1
434 #define LOGICOP_AND_INV 0x2
435 #define LOGICOP_COPY_INV 0x3
436 #define LOGICOP_AND_RVRSE 0x4
437 #define LOGICOP_INV 0x5
438 #define LOGICOP_XOR 0x6
439 #define LOGICOP_NAND 0x7
440 #define LOGICOP_AND 0x8
441 #define LOGICOP_EQUIV 0x9
442 #define LOGICOP_NOOP 0xa
443 #define LOGICOP_OR_INV 0xb
444 #define LOGICOP_COPY 0xc
445 #define LOGICOP_OR_RVRSE 0xd
446 #define LOGICOP_OR 0xe
447 #define LOGICOP_SET 0xf
448
449 #define BLENDFACT_ZERO 0x01
450 #define BLENDFACT_ONE 0x02
451 #define BLENDFACT_SRC_COLR 0x03
452 #define BLENDFACT_INV_SRC_COLR 0x04
453 #define BLENDFACT_SRC_ALPHA 0x05
454 #define BLENDFACT_INV_SRC_ALPHA 0x06
455 #define BLENDFACT_DST_ALPHA 0x07
456 #define BLENDFACT_INV_DST_ALPHA 0x08
457 #define BLENDFACT_DST_COLR 0x09
458 #define BLENDFACT_INV_DST_COLR 0x0a
459 #define BLENDFACT_SRC_ALPHA_SATURATE 0x0b
460 #define BLENDFACT_CONST_COLOR 0x0c
461 #define BLENDFACT_INV_CONST_COLOR 0x0d
462 #define BLENDFACT_CONST_ALPHA 0x0e
463 #define BLENDFACT_INV_CONST_ALPHA 0x0f
464 #define BLENDFACT_MASK 0x0f
465
466
467 extern int intel_translate_compare_func( GLenum func );
468 extern int intel_translate_stencil_op( GLenum op );
469 extern int intel_translate_blend_factor( GLenum factor );
470 extern int intel_translate_logic_op( GLenum opcode );
471
472
473 /* ================================================================
474 * intel_buffers.c:
475 */
476 void intelInitBufferFuncs( struct dd_function_table *functions );
477
478 struct intel_region *intel_readbuf_region( struct intel_context *intel );
479 struct intel_region *intel_drawbuf_region( struct intel_context *intel );
480
481 extern void intelWindowMoved( struct intel_context *intel );
482
483 extern GLboolean intel_intersect_cliprects( drm_clip_rect_t *dest,
484 const drm_clip_rect_t *a,
485 const drm_clip_rect_t *b );
486
487
488 /* ================================================================
489 * intel_pixel_copy.c:
490 */
491 void intelCopyPixels(GLcontext * ctx,
492 GLint srcx, GLint srcy,
493 GLsizei width, GLsizei height,
494 GLint destx, GLint desty, GLenum type);
495
496 GLboolean intel_check_blit_fragment_ops(GLcontext * ctx);
497
498 void intelBitmap(GLcontext * ctx,
499 GLint x, GLint y,
500 GLsizei width, GLsizei height,
501 const struct gl_pixelstore_attrib *unpack,
502 const GLubyte * pixels);
503
504 void intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging);
505 #define _NEW_WINDOW_POS 0x40000000
506
507
508 /*======================================================================
509 * Inline conversion functions.
510 * These are better-typed than the macros used previously:
511 */
512 static inline struct intel_context *intel_context( GLcontext *ctx )
513 {
514 return (struct intel_context *)ctx;
515 }
516
517 static inline struct intel_texture_object *intel_texture_object( struct gl_texture_object *obj )
518 {
519 return (struct intel_texture_object *)obj;
520 }
521
522 static inline struct intel_texture_image *intel_texture_image( struct gl_texture_image *img )
523 {
524 return (struct intel_texture_image *)img;
525 }
526
527 #endif
528