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