intel_context.h revision a389d6bd566ba241a285c3a33039d5e964bc8f30
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 "main/mtypes.h"
34#include "main/mm.h"
35#include "texmem.h"
36#include "dri_metaops.h"
37#include "drm.h"
38#include "intel_bufmgr.h"
39
40#include "intel_screen.h"
41#include "intel_tex_obj.h"
42#include "i915_drm.h"
43#include "tnl/t_vertex.h"
44
45#define TAG(x) intel##x
46#include "tnl_dd/t_dd_vertex.h"
47#undef TAG
48
49#define DV_PF_555  (1<<8)
50#define DV_PF_565  (2<<8)
51#define DV_PF_8888 (3<<8)
52#define DV_PF_4444 (8<<8)
53#define DV_PF_1555 (9<<8)
54
55struct intel_region;
56struct intel_context;
57
58typedef void (*intel_tri_func) (struct intel_context *, intelVertex *,
59                                intelVertex *, intelVertex *);
60typedef void (*intel_line_func) (struct intel_context *, intelVertex *,
61                                 intelVertex *);
62typedef void (*intel_point_func) (struct intel_context *, intelVertex *);
63
64/**
65 * Bits for intel->Fallback field
66 */
67/*@{*/
68#define INTEL_FALLBACK_DRAW_BUFFER	 0x1
69#define INTEL_FALLBACK_READ_BUFFER	 0x2
70#define INTEL_FALLBACK_DEPTH_BUFFER      0x4
71#define INTEL_FALLBACK_STENCIL_BUFFER    0x8
72#define INTEL_FALLBACK_USER		 0x10
73#define INTEL_FALLBACK_RENDERMODE	 0x20
74#define INTEL_FALLBACK_TEXTURE   	 0x40
75#define INTEL_FALLBACK_DRIVER            0x1000  /**< first for drivers */
76/*@}*/
77
78extern void intelFallback(struct intel_context *intel, GLbitfield bit,
79                          GLboolean mode);
80#define FALLBACK( intel, bit, mode ) intelFallback( intel, bit, mode )
81
82
83#define INTEL_WRITE_PART  0x1
84#define INTEL_WRITE_FULL  0x2
85#define INTEL_READ        0x4
86
87#define INTEL_MAX_FIXUP 64
88
89struct intel_sync_object {
90   struct gl_sync_object Base;
91
92   /** Batch associated with this sync object */
93   drm_intel_bo *bo;
94};
95
96/**
97 * intel_context is derived from Mesa's context class: GLcontext.
98 */
99struct intel_context
100{
101   GLcontext ctx;  /**< base class, must be first field */
102
103   struct
104   {
105      void (*destroy) (struct intel_context * intel);
106      void (*emit_state) (struct intel_context * intel);
107      void (*finish_batch) (struct intel_context * intel);
108      void (*new_batch) (struct intel_context * intel);
109      void (*emit_invarient_state) (struct intel_context * intel);
110      void (*update_texture_state) (struct intel_context * intel);
111
112      void (*render_start) (struct intel_context * intel);
113      void (*render_prevalidate) (struct intel_context * intel);
114      void (*set_draw_region) (struct intel_context * intel,
115                               struct intel_region * draw_regions[],
116                               struct intel_region * depth_region,
117			       GLuint num_regions);
118
119      void (*reduced_primitive_state) (struct intel_context * intel,
120                                       GLenum rprim);
121
122      GLboolean (*check_vertex_size) (struct intel_context * intel,
123				      GLuint expected);
124      void (*invalidate_state) (struct intel_context *intel,
125				GLuint new_state);
126
127
128      /* Metaops:
129       */
130      void (*install_meta_state) (struct intel_context * intel);
131      void (*leave_meta_state) (struct intel_context * intel);
132
133      void (*meta_draw_region) (struct intel_context * intel,
134                                struct intel_region * draw_region,
135                                struct intel_region * depth_region);
136
137      void (*meta_color_mask) (struct intel_context * intel, GLboolean);
138
139      void (*meta_stencil_replace) (struct intel_context * intel,
140                                    GLuint mask, GLuint clear);
141
142      void (*meta_depth_replace) (struct intel_context * intel);
143
144      void (*meta_texture_blend_replace) (struct intel_context * intel);
145
146      void (*meta_no_stencil_write) (struct intel_context * intel);
147      void (*meta_no_depth_write) (struct intel_context * intel);
148      void (*meta_no_texture) (struct intel_context * intel);
149
150      void (*meta_import_pixel_state) (struct intel_context * intel);
151      void (*meta_frame_buffer_texture) (struct intel_context *intel,
152					 GLint xoff, GLint yoff);
153
154      GLboolean(*meta_tex_rect_source) (struct intel_context * intel,
155					dri_bo * buffer,
156					GLuint offset,
157					GLuint pitch,
158					GLuint height,
159					GLenum format, GLenum type);
160
161      void (*assert_not_dirty) (struct intel_context *intel);
162
163      void (*debug_batch)(struct intel_context *intel);
164   } vtbl;
165
166   struct dri_metaops meta;
167
168   GLbitfield Fallback;  /**< mask of INTEL_FALLBACK_x bits */
169   GLuint NewGLState;
170
171   dri_bufmgr *bufmgr;
172   unsigned int maxBatchSize;
173
174   /**
175    * Generation number of the hardware: 2 is 8xx, 3 is 9xx pre-965, 4 is 965.
176    */
177   int gen;
178   GLboolean needs_ff_sync;
179   GLboolean is_ironlake;
180   GLboolean is_g4x;
181   GLboolean is_945;
182   GLboolean has_luminance_srgb;
183
184   int urb_size;
185
186   struct intel_batchbuffer *batch;
187   drm_intel_bo *first_post_swapbuffers_batch;
188   GLboolean no_batch_wrap;
189   GLboolean using_dri2_swapbuffers;
190
191   struct
192   {
193      GLuint id;
194      uint32_t primitive;	/**< Current hardware primitive type */
195      void (*flush) (struct intel_context *);
196      GLubyte *start_ptr; /**< for i8xx */
197      dri_bo *vb_bo;
198      uint8_t *vb;
199      unsigned int start_offset; /**< Byte offset of primitive sequence */
200      unsigned int current_offset; /**< Byte offset of next vertex */
201      unsigned int count;	/**< Number of vertices in current primitive */
202   } prim;
203
204   GLuint stats_wm;
205   GLboolean locked;
206   char *prevLockFile;
207   int prevLockLine;
208
209   /* Offsets of fields within the current vertex:
210    */
211   GLuint coloroffset;
212   GLuint specoffset;
213   GLuint wpos_offset;
214   GLuint wpos_size;
215
216   struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
217   GLuint vertex_attr_count;
218
219   GLfloat polygon_offset_scale;        /* dependent on depth_scale, bpp */
220
221   GLboolean hw_stencil;
222   GLboolean hw_stipple;
223   GLboolean depth_buffer_is_float;
224   GLboolean no_rast;
225   GLboolean no_hw;
226   GLboolean always_flush_batch;
227   GLboolean always_flush_cache;
228
229   /* 0 - nonconformant, best performance;
230    * 1 - fallback to sw for known conformance bugs
231    * 2 - always fallback to sw
232    */
233   GLuint conformance_mode;
234
235   /* State for intelvb.c and inteltris.c.
236    */
237   GLuint RenderIndex;
238   GLmatrix ViewportMatrix;
239   GLenum render_primitive;
240   GLenum reduced_primitive;
241   GLuint vertex_size;
242   GLubyte *verts;              /* points to tnl->clipspace.vertex_buf */
243
244   /* Fallback rasterization functions
245    */
246   intel_point_func draw_point;
247   intel_line_func draw_line;
248   intel_tri_func draw_tri;
249
250   /**
251    * Set if rendering has occured to the drawable's front buffer.
252    *
253    * This is used in the DRI2 case to detect that glFlush should also copy
254    * the contents of the fake front buffer to the real front buffer.
255    */
256   GLboolean front_buffer_dirty;
257
258   /**
259    * Track whether front-buffer rendering is currently enabled
260    *
261    * A separate flag is used to track this in order to support MRT more
262    * easily.
263    */
264   GLboolean is_front_buffer_rendering;
265   /**
266    * Track whether front-buffer is the current read target.
267    *
268    * This is closely associated with is_front_buffer_rendering, but may
269    * be set separately.  The DRI2 fake front buffer must be referenced
270    * either way.
271    */
272   GLboolean is_front_buffer_reading;
273
274   GLboolean use_texture_tiling;
275   GLboolean use_early_z;
276
277   int driFd;
278
279   __DRIcontext *driContext;
280   __DRIdrawable *driDrawable;
281   __DRIdrawable *driReadDrawable;
282   __DRIscreen *driScreen;
283   intelScreenPrivate *intelScreen;
284
285   /**
286    * Configuration cache
287    */
288   driOptionCache optionCache;
289};
290
291extern char *__progname;
292
293
294#define SUBPIXEL_X 0.125
295#define SUBPIXEL_Y 0.125
296
297#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
298#define ALIGN(value, alignment)  ((value + alignment - 1) & ~(alignment - 1))
299#define IS_POWER_OF_TWO(val) (((val) & (val - 1)) == 0)
300
301static INLINE uint32_t
302U_FIXED(float value, uint32_t frac_bits)
303{
304   value *= (1 << frac_bits);
305   return value < 0 ? 0 : value;
306}
307
308static INLINE uint32_t
309S_FIXED(float value, uint32_t frac_bits)
310{
311   return value * (1 << frac_bits);
312}
313
314#define INTEL_FIREVERTICES(intel)		\
315do {						\
316   if ((intel)->prim.flush)			\
317      (intel)->prim.flush(intel);		\
318} while (0)
319
320/* ================================================================
321 * From linux kernel i386 header files, copes with odd sizes better
322 * than COPY_DWORDS would:
323 * XXX Put this in src/mesa/main/imports.h ???
324 */
325#if defined(i386) || defined(__i386__)
326static INLINE void * __memcpy(void * to, const void * from, size_t n)
327{
328   int d0, d1, d2;
329   __asm__ __volatile__(
330      "rep ; movsl\n\t"
331      "testb $2,%b4\n\t"
332      "je 1f\n\t"
333      "movsw\n"
334      "1:\ttestb $1,%b4\n\t"
335      "je 2f\n\t"
336      "movsb\n"
337      "2:"
338      : "=&c" (d0), "=&D" (d1), "=&S" (d2)
339      :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
340      : "memory");
341   return (to);
342}
343#else
344#define __memcpy(a,b,c) memcpy(a,b,c)
345#endif
346
347
348/* ================================================================
349 * Debugging:
350 */
351extern int INTEL_DEBUG;
352
353#define DEBUG_TEXTURE	0x1
354#define DEBUG_STATE	0x2
355#define DEBUG_IOCTL	0x4
356#define DEBUG_BLIT	0x8
357#define DEBUG_MIPTREE   0x10
358#define DEBUG_FALLBACKS	0x20
359#define DEBUG_VERBOSE	0x40
360#define DEBUG_BATCH     0x80
361#define DEBUG_PIXEL     0x100
362#define DEBUG_BUFMGR    0x200
363#define DEBUG_REGION    0x400
364#define DEBUG_FBO       0x800
365#define DEBUG_LOCK      0x1000
366#define DEBUG_SYNC	0x2000
367#define DEBUG_PRIMS	0x4000
368#define DEBUG_VERTS	0x8000
369#define DEBUG_DRI       0x10000
370#define DEBUG_DMA       0x20000
371#define DEBUG_SANITY    0x40000
372#define DEBUG_SLEEP     0x80000
373#define DEBUG_STATS     0x100000
374#define DEBUG_TILE      0x200000
375#define DEBUG_SINGLE_THREAD   0x400000
376#define DEBUG_WM        0x800000
377#define DEBUG_URB       0x1000000
378#define DEBUG_VS        0x2000000
379
380#define DBG(...) do {						\
381	if (INTEL_DEBUG & FILE_DEBUG_FLAG)			\
382		_mesa_printf(__VA_ARGS__);			\
383} while(0)
384
385#define PCI_CHIP_845_G			0x2562
386#define PCI_CHIP_I830_M			0x3577
387#define PCI_CHIP_I855_GM		0x3582
388#define PCI_CHIP_I865_G			0x2572
389#define PCI_CHIP_I915_G			0x2582
390#define PCI_CHIP_I915_GM		0x2592
391#define PCI_CHIP_I945_G			0x2772
392#define PCI_CHIP_I945_GM		0x27A2
393#define PCI_CHIP_I945_GME		0x27AE
394#define PCI_CHIP_G33_G			0x29C2
395#define PCI_CHIP_Q35_G			0x29B2
396#define PCI_CHIP_Q33_G			0x29D2
397
398
399/* ================================================================
400 * intel_context.c:
401 */
402
403extern GLboolean intelInitContext(struct intel_context *intel,
404                                  const __GLcontextModes * mesaVis,
405                                  __DRIcontext * driContextPriv,
406                                  void *sharedContextPrivate,
407                                  struct dd_function_table *functions);
408
409extern void intelFinish(GLcontext * ctx);
410extern void intelFlush(GLcontext * ctx);
411extern void intel_flush(GLcontext * ctx, GLboolean needs_mi_flush);
412
413extern void intelInitDriverFunctions(struct dd_function_table *functions);
414
415void intel_init_syncobj_functions(struct dd_function_table *functions);
416
417
418/* ================================================================
419 * intel_state.c:
420 */
421extern void intelInitStateFuncs(struct dd_function_table *functions);
422
423#define COMPAREFUNC_ALWAYS		0
424#define COMPAREFUNC_NEVER		0x1
425#define COMPAREFUNC_LESS		0x2
426#define COMPAREFUNC_EQUAL		0x3
427#define COMPAREFUNC_LEQUAL		0x4
428#define COMPAREFUNC_GREATER		0x5
429#define COMPAREFUNC_NOTEQUAL		0x6
430#define COMPAREFUNC_GEQUAL		0x7
431
432#define STENCILOP_KEEP			0
433#define STENCILOP_ZERO			0x1
434#define STENCILOP_REPLACE		0x2
435#define STENCILOP_INCRSAT		0x3
436#define STENCILOP_DECRSAT		0x4
437#define STENCILOP_INCR			0x5
438#define STENCILOP_DECR			0x6
439#define STENCILOP_INVERT		0x7
440
441#define LOGICOP_CLEAR			0
442#define LOGICOP_NOR			0x1
443#define LOGICOP_AND_INV 		0x2
444#define LOGICOP_COPY_INV		0x3
445#define LOGICOP_AND_RVRSE		0x4
446#define LOGICOP_INV			0x5
447#define LOGICOP_XOR			0x6
448#define LOGICOP_NAND			0x7
449#define LOGICOP_AND			0x8
450#define LOGICOP_EQUIV			0x9
451#define LOGICOP_NOOP			0xa
452#define LOGICOP_OR_INV			0xb
453#define LOGICOP_COPY			0xc
454#define LOGICOP_OR_RVRSE		0xd
455#define LOGICOP_OR			0xe
456#define LOGICOP_SET			0xf
457
458#define BLENDFACT_ZERO			0x01
459#define BLENDFACT_ONE			0x02
460#define BLENDFACT_SRC_COLR		0x03
461#define BLENDFACT_INV_SRC_COLR 		0x04
462#define BLENDFACT_SRC_ALPHA		0x05
463#define BLENDFACT_INV_SRC_ALPHA 	0x06
464#define BLENDFACT_DST_ALPHA		0x07
465#define BLENDFACT_INV_DST_ALPHA 	0x08
466#define BLENDFACT_DST_COLR		0x09
467#define BLENDFACT_INV_DST_COLR		0x0a
468#define BLENDFACT_SRC_ALPHA_SATURATE	0x0b
469#define BLENDFACT_CONST_COLOR		0x0c
470#define BLENDFACT_INV_CONST_COLOR	0x0d
471#define BLENDFACT_CONST_ALPHA		0x0e
472#define BLENDFACT_INV_CONST_ALPHA	0x0f
473#define BLENDFACT_MASK          	0x0f
474
475enum {
476   DRI_CONF_BO_REUSE_DISABLED,
477   DRI_CONF_BO_REUSE_ALL
478};
479
480extern int intel_translate_shadow_compare_func(GLenum func);
481extern int intel_translate_compare_func(GLenum func);
482extern int intel_translate_stencil_op(GLenum op);
483extern int intel_translate_blend_factor(GLenum factor);
484extern int intel_translate_logic_op(GLenum opcode);
485
486void intel_viewport(GLcontext * ctx, GLint x, GLint y,
487		    GLsizei width, GLsizei height);
488
489void intel_update_renderbuffers(__DRIcontext *context,
490				__DRIdrawable *drawable);
491
492void i915_set_buf_info_for_region(uint32_t *state, struct intel_region *region,
493				  uint32_t buffer_id);
494
495/*======================================================================
496 * Inline conversion functions.
497 * These are better-typed than the macros used previously:
498 */
499static INLINE struct intel_context *
500intel_context(GLcontext * ctx)
501{
502   return (struct intel_context *) ctx;
503}
504
505static INLINE GLboolean
506is_power_of_two(uint32_t value)
507{
508   return (value & (value - 1)) == 0;
509}
510
511static INLINE void
512intel_bo_map_gtt_preferred(struct intel_context *intel,
513			   drm_intel_bo *bo,
514			   GLboolean write)
515{
516   if (intel->intelScreen->kernel_exec_fencing)
517      drm_intel_gem_bo_map_gtt(bo);
518   else
519      drm_intel_bo_map(bo, write);
520}
521
522static INLINE void
523intel_bo_unmap_gtt_preferred(struct intel_context *intel,
524			     drm_intel_bo *bo)
525{
526   if (intel->intelScreen->kernel_exec_fencing)
527      drm_intel_gem_bo_unmap_gtt(bo);
528   else
529      drm_intel_bo_unmap(bo);
530}
531
532#endif
533