~ubuntu-branches/ubuntu/quantal/mesa/quantal

« back to all changes in this revision

Viewing changes to src/mesa/drivers/dri/i915tex/intel_context.h

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2007-02-21 12:44:07 UTC
  • mfrom: (1.2.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 22.
  • Revision ID: james.westby@ubuntu.com-20070221124407-rgcacs32mycrtadl
ImportĀ upstreamĀ versionĀ 6.5.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
38
#include "intel_screen.h"
 
39
#include "i915_drm.h"
 
40
#include "i830_common.h"
 
41
#include "tnl/t_vertex.h"
 
42
 
 
43
#define TAG(x) intel##x
 
44
#include "tnl_dd/t_dd_vertex.h"
 
45
#undef TAG
 
46
 
 
47
#define DV_PF_555  (1<<8)
 
48
#define DV_PF_565  (2<<8)
 
49
#define DV_PF_8888 (3<<8)
 
50
 
 
51
struct intel_region;
 
52
struct intel_context;
 
53
struct _DriBufferObject;
 
54
 
 
55
typedef void (*intel_tri_func) (struct intel_context *, intelVertex *,
 
56
                                intelVertex *, intelVertex *);
 
57
typedef void (*intel_line_func) (struct intel_context *, intelVertex *,
 
58
                                 intelVertex *);
 
59
typedef void (*intel_point_func) (struct intel_context *, intelVertex *);
 
60
 
 
61
#define INTEL_FALLBACK_DRAW_BUFFER       0x1
 
62
#define INTEL_FALLBACK_READ_BUFFER       0x2
 
63
#define INTEL_FALLBACK_DEPTH_BUFFER      0x4
 
64
#define INTEL_FALLBACK_STENCIL_BUFFER    0x8
 
65
#define INTEL_FALLBACK_USER              0x10
 
66
#define INTEL_FALLBACK_RENDERMODE        0x20
 
67
 
 
68
extern void intelFallback(struct intel_context *intel, GLuint bit,
 
69
                          GLboolean mode);
 
70
#define FALLBACK( intel, bit, mode ) intelFallback( intel, bit, mode )
 
71
 
 
72
 
 
73
#define INTEL_WRITE_PART  0x1
 
74
#define INTEL_WRITE_FULL  0x2
 
75
#define INTEL_READ        0x4
 
76
 
 
77
struct intel_texture_object
 
78
{
 
79
   struct gl_texture_object base;       /* The "parent" object */
 
80
 
 
81
   /* The mipmap tree must include at least these levels once
 
82
    * validated:
 
83
    */
 
84
   GLuint firstLevel;
 
85
   GLuint lastLevel;
 
86
 
 
87
   /* Offset for firstLevel image:
 
88
    */
 
89
   GLuint textureOffset;
 
90
 
 
91
   /* On validation any active images held in main memory or in other
 
92
    * regions will be copied to this region and the old storage freed.
 
93
    */
 
94
   struct intel_mipmap_tree *mt;
 
95
};
 
96
 
 
97
 
 
98
 
 
99
struct intel_texture_image
 
100
{
 
101
   struct gl_texture_image base;
 
102
 
 
103
   /* These aren't stored in gl_texture_image 
 
104
    */
 
105
   GLuint level;
 
106
   GLuint face;
 
107
 
 
108
   /* If intelImage->mt != NULL, image data is stored here.
 
109
    * Else if intelImage->base.Data != NULL, image is stored there.
 
110
    * Else there is no image data.
 
111
    */
 
112
   struct intel_mipmap_tree *mt;
 
113
};
 
114
 
 
115
 
 
116
#define INTEL_MAX_FIXUP 64
 
117
 
 
118
struct intel_context
 
119
{
 
120
   GLcontext ctx;               /* the parent class */
 
121
 
 
122
   struct
 
123
   {
 
124
      void (*destroy) (struct intel_context * intel);
 
125
      void (*emit_state) (struct intel_context * intel);
 
126
      void (*lost_hardware) (struct intel_context * intel);
 
127
      void (*update_texture_state) (struct intel_context * intel);
 
128
 
 
129
      void (*render_start) (struct intel_context * intel);
 
130
      void (*set_draw_region) (struct intel_context * intel,
 
131
                               struct intel_region * draw_region,
 
132
                               struct intel_region * depth_region);
 
133
 
 
134
        GLuint(*flush_cmd) (void);
 
135
 
 
136
      void (*reduced_primitive_state) (struct intel_context * intel,
 
137
                                       GLenum rprim);
 
138
 
 
139
        GLboolean(*check_vertex_size) (struct intel_context * intel,
 
140
                                       GLuint expected);
 
141
 
 
142
 
 
143
      /* Metaops: 
 
144
       */
 
145
      void (*install_meta_state) (struct intel_context * intel);
 
146
      void (*leave_meta_state) (struct intel_context * intel);
 
147
 
 
148
      void (*meta_draw_region) (struct intel_context * intel,
 
149
                                struct intel_region * draw_region,
 
150
                                struct intel_region * depth_region);
 
151
 
 
152
      void (*meta_color_mask) (struct intel_context * intel, GLboolean);
 
153
 
 
154
      void (*meta_stencil_replace) (struct intel_context * intel,
 
155
                                    GLuint mask, GLuint clear);
 
156
 
 
157
      void (*meta_depth_replace) (struct intel_context * intel);
 
158
 
 
159
      void (*meta_texture_blend_replace) (struct intel_context * intel);
 
160
 
 
161
      void (*meta_no_stencil_write) (struct intel_context * intel);
 
162
      void (*meta_no_depth_write) (struct intel_context * intel);
 
163
      void (*meta_no_texture) (struct intel_context * intel);
 
164
 
 
165
      void (*meta_import_pixel_state) (struct intel_context * intel);
 
166
 
 
167
        GLboolean(*meta_tex_rect_source) (struct intel_context * intel,
 
168
                                          struct _DriBufferObject * buffer,
 
169
                                          GLuint offset,
 
170
                                          GLuint pitch,
 
171
                                          GLuint height,
 
172
                                          GLenum format, GLenum type);
 
173
      void (*rotate_window) (struct intel_context * intel,
 
174
                             __DRIdrawablePrivate * dPriv, GLuint srcBuf);
 
175
 
 
176
      void (*assert_not_dirty) (struct intel_context *intel);
 
177
 
 
178
   } vtbl;
 
179
 
 
180
   GLint refcount;
 
181
   GLuint Fallback;
 
182
   GLuint NewGLState;
 
183
 
 
184
   struct _DriFenceObject *last_swap_fence;
 
185
   struct _DriFenceObject *first_swap_fence;
 
186
 
 
187
   struct intel_batchbuffer *batch;
 
188
 
 
189
   struct
 
190
   {
 
191
      GLuint id;
 
192
      GLuint primitive;
 
193
      GLubyte *start_ptr;
 
194
      void (*flush) (struct intel_context *);
 
195
   } prim;
 
196
 
 
197
   GLboolean locked;
 
198
   char *prevLockFile;
 
199
   int prevLockLine;
 
200
 
 
201
   GLuint ClearColor565;
 
202
   GLuint ClearColor8888;
 
203
 
 
204
   /* Offsets of fields within the current vertex:
 
205
    */
 
206
   GLuint coloroffset;
 
207
   GLuint specoffset;
 
208
   GLuint wpos_offset;
 
209
   GLuint wpos_size;
 
210
 
 
211
   struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
 
212
   GLuint vertex_attr_count;
 
213
 
 
214
   GLfloat polygon_offset_scale;        /* dependent on depth_scale, bpp */
 
215
 
 
216
   GLboolean hw_stipple;
 
217
   GLboolean strict_conformance;
 
218
 
 
219
   /* AGP memory buffer manager:
 
220
    */
 
221
   struct bufmgr *bm;
 
222
 
 
223
 
 
224
   /* State for intelvb.c and inteltris.c.
 
225
    */
 
226
   GLuint RenderIndex;
 
227
   GLmatrix ViewportMatrix;
 
228
   GLenum render_primitive;
 
229
   GLenum reduced_primitive;
 
230
   GLuint vertex_size;
 
231
   GLubyte *verts;              /* points to tnl->clipspace.vertex_buf */
 
232
 
 
233
#if 0
 
234
   struct intel_region *front_region;   /* XXX FBO: obsolete */
 
235
   struct intel_region *rotated_region; /* XXX FBO: obsolete */
 
236
   struct intel_region *back_region;    /* XXX FBO: obsolete */
 
237
   struct intel_region *draw_region;    /* XXX FBO: rename to color_region */
 
238
   struct intel_region *depth_region;   /**< currently bound depth/Z region */
 
239
#endif
 
240
 
 
241
   /* Fallback rasterization functions 
 
242
    */
 
243
   intel_point_func draw_point;
 
244
   intel_line_func draw_line;
 
245
   intel_tri_func draw_tri;
 
246
 
 
247
   /* These refer to the current drawing buffer:
 
248
    */
 
249
   int drawX, drawY;            /**< origin of drawing area within region */
 
250
   GLuint numClipRects;         /**< cliprects for drawing */
 
251
   drm_clip_rect_t *pClipRects;
 
252
   drm_clip_rect_t fboRect;     /**< cliprect for FBO rendering */
 
253
 
 
254
   int perf_boxes;
 
255
 
 
256
   GLuint do_usleeps;
 
257
   int do_irqs;
 
258
   GLuint irqsEmitted;
 
259
   drm_i915_irq_wait_t iw;
 
260
 
 
261
   drm_context_t hHWContext;
 
262
   drmLock *driHwLock;
 
263
   int driFd;
 
264
 
 
265
   __DRIdrawablePrivate *driDrawable;
 
266
   __DRIscreenPrivate *driScreen;
 
267
   intelScreenPrivate *intelScreen;
 
268
   drmI830Sarea *sarea;
 
269
 
 
270
   GLuint lastStamp;
 
271
 
 
272
   /**
 
273
    * Configuration cache
 
274
    */
 
275
   driOptionCache optionCache;
 
276
 
 
277
   /* VBI
 
278
    */
 
279
   GLuint vbl_seq;
 
280
   GLuint vblank_flags;
 
281
 
 
282
   int64_t swap_ust;
 
283
   int64_t swap_missed_ust;
 
284
 
 
285
   GLuint swap_count;
 
286
   GLuint swap_missed_count;
 
287
 
 
288
   GLuint swap_scheduled;
 
289
};
 
290
 
 
291
/* These are functions now:
 
292
 */
 
293
void LOCK_HARDWARE( struct intel_context *intel );
 
294
void UNLOCK_HARDWARE( struct intel_context *intel );
 
295
 
 
296
extern char *__progname;
 
297
 
 
298
 
 
299
#define SUBPIXEL_X 0.125
 
300
#define SUBPIXEL_Y 0.125
 
301
 
 
302
#define INTEL_FIREVERTICES(intel)               \
 
303
do {                                            \
 
304
   if ((intel)->prim.flush)                     \
 
305
      (intel)->prim.flush(intel);               \
 
306
} while (0)
 
307
 
 
308
/* ================================================================
 
309
 * Color packing:
 
310
 */
 
311
 
 
312
#define INTEL_PACKCOLOR4444(r,g,b,a) \
 
313
  ((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4))
 
314
 
 
315
#define INTEL_PACKCOLOR1555(r,g,b,a) \
 
316
  ((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
 
317
    ((a) ? 0x8000 : 0))
 
318
 
 
319
#define INTEL_PACKCOLOR565(r,g,b) \
 
320
  ((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
 
321
 
 
322
#define INTEL_PACKCOLOR8888(r,g,b,a) \
 
323
  ((a<<24) | (r<<16) | (g<<8) | b)
 
324
 
 
325
 
 
326
 
 
327
/* ================================================================
 
328
 * From linux kernel i386 header files, copes with odd sizes better
 
329
 * than COPY_DWORDS would:
 
330
 * XXX Put this in src/mesa/main/imports.h ???
 
331
 */
 
332
#if defined(i386) || defined(__i386__)
 
333
static INLINE void *
 
334
__memcpy(void *to, const void *from, size_t n)
 
335
{
 
336
   int d0, d1, d2;
 
337
   __asm__ __volatile__("rep ; movsl\n\t"
 
338
                        "testb $2,%b4\n\t"
 
339
                        "je 1f\n\t"
 
340
                        "movsw\n"
 
341
                        "1:\ttestb $1,%b4\n\t"
 
342
                        "je 2f\n\t"
 
343
                        "movsb\n" "2:":"=&c"(d0), "=&D"(d1), "=&S"(d2)
 
344
                        :"0"(n / 4), "q"(n), "1"((long) to), "2"((long) from)
 
345
                        :"memory");
 
346
   return (to);
 
347
}
 
348
#else
 
349
#define __memcpy(a,b,c) memcpy(a,b,c)
 
350
#endif
 
351
 
 
352
 
 
353
 
 
354
/* ================================================================
 
355
 * Debugging:
 
356
 */
 
357
#define DO_DEBUG                0
 
358
#if DO_DEBUG
 
359
extern int INTEL_DEBUG;
 
360
#else
 
361
#define INTEL_DEBUG             0
 
362
#endif
 
363
 
 
364
#define DEBUG_TEXTURE   0x1
 
365
#define DEBUG_STATE     0x2
 
366
#define DEBUG_IOCTL     0x4
 
367
#define DEBUG_BLIT      0x8
 
368
#define DEBUG_MIPTREE   0x10
 
369
#define DEBUG_FALLBACKS 0x20
 
370
#define DEBUG_VERBOSE   0x40
 
371
#define DEBUG_BATCH     0x80
 
372
#define DEBUG_PIXEL     0x100
 
373
#define DEBUG_BUFMGR    0x200
 
374
#define DEBUG_REGION    0x400
 
375
#define DEBUG_FBO       0x800
 
376
#define DEBUG_LOCK      0x1000
 
377
 
 
378
#define DBG(...)  do { if (INTEL_DEBUG & FILE_DEBUG_FLAG) _mesa_printf(__VA_ARGS__); } while(0)
 
379
 
 
380
 
 
381
#define PCI_CHIP_845_G                  0x2562
 
382
#define PCI_CHIP_I830_M                 0x3577
 
383
#define PCI_CHIP_I855_GM                0x3582
 
384
#define PCI_CHIP_I865_G                 0x2572
 
385
#define PCI_CHIP_I915_G                 0x2582
 
386
#define PCI_CHIP_I915_GM                0x2592
 
387
#define PCI_CHIP_I945_G                 0x2772
 
388
#define PCI_CHIP_I945_GM                0x27A2
 
389
 
 
390
 
 
391
/* ================================================================
 
392
 * intel_context.c:
 
393
 */
 
394
 
 
395
extern GLboolean intelInitContext(struct intel_context *intel,
 
396
                                  const __GLcontextModes * mesaVis,
 
397
                                  __DRIcontextPrivate * driContextPriv,
 
398
                                  void *sharedContextPrivate,
 
399
                                  struct dd_function_table *functions);
 
400
 
 
401
extern void intelGetLock(struct intel_context *intel, GLuint flags);
 
402
 
 
403
extern void intelInitState(GLcontext * ctx);
 
404
extern void intelFinish(GLcontext * ctx);
 
405
extern void intelFlush(GLcontext * ctx);
 
406
 
 
407
extern void intelInitDriverFunctions(struct dd_function_table *functions);
 
408
 
 
409
 
 
410
/* ================================================================
 
411
 * intel_state.c:
 
412
 */
 
413
extern void intelInitStateFuncs(struct dd_function_table *functions);
 
414
 
 
415
#define COMPAREFUNC_ALWAYS              0
 
416
#define COMPAREFUNC_NEVER               0x1
 
417
#define COMPAREFUNC_LESS                0x2
 
418
#define COMPAREFUNC_EQUAL               0x3
 
419
#define COMPAREFUNC_LEQUAL              0x4
 
420
#define COMPAREFUNC_GREATER             0x5
 
421
#define COMPAREFUNC_NOTEQUAL            0x6
 
422
#define COMPAREFUNC_GEQUAL              0x7
 
423
 
 
424
#define STENCILOP_KEEP                  0
 
425
#define STENCILOP_ZERO                  0x1
 
426
#define STENCILOP_REPLACE               0x2
 
427
#define STENCILOP_INCRSAT               0x3
 
428
#define STENCILOP_DECRSAT               0x4
 
429
#define STENCILOP_INCR                  0x5
 
430
#define STENCILOP_DECR                  0x6
 
431
#define STENCILOP_INVERT                0x7
 
432
 
 
433
#define LOGICOP_CLEAR                   0
 
434
#define LOGICOP_NOR                     0x1
 
435
#define LOGICOP_AND_INV                 0x2
 
436
#define LOGICOP_COPY_INV                0x3
 
437
#define LOGICOP_AND_RVRSE               0x4
 
438
#define LOGICOP_INV                     0x5
 
439
#define LOGICOP_XOR                     0x6
 
440
#define LOGICOP_NAND                    0x7
 
441
#define LOGICOP_AND                     0x8
 
442
#define LOGICOP_EQUIV                   0x9
 
443
#define LOGICOP_NOOP                    0xa
 
444
#define LOGICOP_OR_INV                  0xb
 
445
#define LOGICOP_COPY                    0xc
 
446
#define LOGICOP_OR_RVRSE                0xd
 
447
#define LOGICOP_OR                      0xe
 
448
#define LOGICOP_SET                     0xf
 
449
 
 
450
#define BLENDFACT_ZERO                  0x01
 
451
#define BLENDFACT_ONE                   0x02
 
452
#define BLENDFACT_SRC_COLR              0x03
 
453
#define BLENDFACT_INV_SRC_COLR          0x04
 
454
#define BLENDFACT_SRC_ALPHA             0x05
 
455
#define BLENDFACT_INV_SRC_ALPHA         0x06
 
456
#define BLENDFACT_DST_ALPHA             0x07
 
457
#define BLENDFACT_INV_DST_ALPHA         0x08
 
458
#define BLENDFACT_DST_COLR              0x09
 
459
#define BLENDFACT_INV_DST_COLR          0x0a
 
460
#define BLENDFACT_SRC_ALPHA_SATURATE    0x0b
 
461
#define BLENDFACT_CONST_COLOR           0x0c
 
462
#define BLENDFACT_INV_CONST_COLOR       0x0d
 
463
#define BLENDFACT_CONST_ALPHA           0x0e
 
464
#define BLENDFACT_INV_CONST_ALPHA       0x0f
 
465
#define BLENDFACT_MASK                  0x0f
 
466
 
 
467
#define MI_BATCH_BUFFER_END     (0xA<<23)
 
468
 
 
469
 
 
470
extern int intel_translate_compare_func(GLenum func);
 
471
extern int intel_translate_stencil_op(GLenum op);
 
472
extern int intel_translate_blend_factor(GLenum factor);
 
473
extern int intel_translate_logic_op(GLenum opcode);
 
474
 
 
475
 
 
476
/*======================================================================
 
477
 * Inline conversion functions.  
 
478
 * These are better-typed than the macros used previously:
 
479
 */
 
480
static INLINE struct intel_context *
 
481
intel_context(GLcontext * ctx)
 
482
{
 
483
   return (struct intel_context *) ctx;
 
484
}
 
485
 
 
486
static INLINE struct intel_texture_object *
 
487
intel_texture_object(struct gl_texture_object *obj)
 
488
{
 
489
   return (struct intel_texture_object *) obj;
 
490
}
 
491
 
 
492
static INLINE struct intel_texture_image *
 
493
intel_texture_image(struct gl_texture_image *img)
 
494
{
 
495
   return (struct intel_texture_image *) img;
 
496
}
 
497
 
 
498
extern struct intel_renderbuffer *intel_renderbuffer(struct gl_renderbuffer
 
499
                                                     *rb);
 
500
 
 
501
 
 
502
#endif