mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-29 01:30:08 +01:00
remove very old i830 code
This commit is contained in:
parent
f3134ca7ad
commit
65573edd1b
23 changed files with 0 additions and 9347 deletions
|
|
@ -1,31 +0,0 @@
|
|||
|
||||
TOP = ../../../../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
LIBNAME = i830_dri.so
|
||||
|
||||
DRIVER_SOURCES = \
|
||||
i830_context.c \
|
||||
i830_debug.c \
|
||||
i830_ioctl.c \
|
||||
i830_render.c \
|
||||
i830_screen.c \
|
||||
i830_span.c \
|
||||
i830_state.c \
|
||||
i830_tex.c \
|
||||
i830_texmem.c \
|
||||
i830_texstate.c \
|
||||
i830_tris.c
|
||||
|
||||
C_SOURCES = \
|
||||
$(COMMON_SOURCES) \
|
||||
$(MINIGLX_SOURCES) \
|
||||
$(DRIVER_SOURCES)
|
||||
|
||||
ASM_SOURCES =
|
||||
|
||||
|
||||
|
||||
include ../Makefile.template
|
||||
|
||||
symlinks:
|
||||
|
|
@ -1,677 +0,0 @@
|
|||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_3d_reg.h,v 1.4 2002/12/10 01:26:53 dawes Exp $ */
|
||||
#define I830_SET_FIELD( var, mask, value ) (var &= ~(mask), var |= value)
|
||||
|
||||
#define CMD_3D (0x3<<29)
|
||||
|
||||
/* 3DPRIMITIVE, p104 */
|
||||
#define PRIM3D_INLINE (CMD_3D | (0x1f<<24))
|
||||
#define PRIM3D_INDIRECT_SEQ ((1<<23) | PRIM3D_INLINE)
|
||||
#define PRIM3D_INDICES ((1<<23) | PRIM3D_INLINE | (1<<17))
|
||||
|
||||
#define PRIM3D_INLINE_CNT(used) ((used / 4) - 2)
|
||||
#define PRIM3D_INDICES_CNT(num_indices) ((num_indices + 1) / 2)
|
||||
#define PRIM3D_INDIRECT_CNT(verts) (verts)
|
||||
|
||||
#define PRIM3D_TRILIST 0
|
||||
#define PRIM3D_TRISTRIP (0x1<<18)
|
||||
#define PRIM3D_TRISTRIP_RVRSE (0x2<<18)
|
||||
#define PRIM3D_TRIFAN (0x3<<18)
|
||||
#define PRIM3D_POLY (0x4<<18)
|
||||
#define PRIM3D_LINELIST (0x5<<18)
|
||||
#define PRIM3D_LINESTRIP (0x6<<18)
|
||||
#define PRIM3D_RECTLIST (0x7<<18)
|
||||
#define PRIM3D_POINTLIST (0x8<<18)
|
||||
#define PRIM3D_DIB (0x9<<18)
|
||||
|
||||
/* STATE3D_ANTI_ALIASING, p 123 */
|
||||
#define STATE3D_AA_CMD (CMD_3D | (0x06<<24))
|
||||
|
||||
#define AA_LINE_ECAAR_WIDTH_ENABLE (1<<16)
|
||||
#define AA_LINE_ECAAR_WIDTH_0_5 0
|
||||
#define AA_LINE_ECAAR_WIDTH_1_0 (1<<14)
|
||||
#define AA_LINE_ECAAR_WIDTH_2_0 (2<<14)
|
||||
#define AA_LINE_ECAAR_WIDTH_4_0 (3<<14)
|
||||
|
||||
#define AA_LINE_REGION_WIDTH_ENABLE (1<<8)
|
||||
#define AA_LINE_REGION_WIDTH_0_5 0
|
||||
#define AA_LINE_REGION_WIDTH_1_0 (1<<6)
|
||||
#define AA_LINE_REGION_WIDTH_2_0 (2<<6)
|
||||
#define AA_LINE_REGION_WIDTH_4_0 (3<<6)
|
||||
|
||||
#define AA_LINE_ENABLE ((1<<1) | 1)
|
||||
#define AA_LINE_DISABLE (1<<1)
|
||||
|
||||
/* STATE3D_BUFFER_INFO, p 124 */
|
||||
#define STATE3D_BUF_INFO_CMD (CMD_3D | (0x1d<<24) | (0x8e<<16) | 1)
|
||||
/* Dword 1 */
|
||||
#define BUF_3D_ID_COLOR_BACK (0x3<<24)
|
||||
#define BUF_3D_ID_DEPTH (0x7<<24)
|
||||
#define BUF_3D_USE_FENCE (1<<23)
|
||||
#define BUF_3D_TILED_SURFACE (1<<22)
|
||||
#define BUF_3D_TILE_WALK_X 0
|
||||
#define BUF_3D_TILE_WALK_Y (1<<21)
|
||||
#define BUF_3D_PITCH(x) ((x)<<2)
|
||||
/* Dword 2 */
|
||||
#define BUF_3D_ADDR(x) ((x) & ~0x3)
|
||||
|
||||
/* STATE3D_COLOR_FACTOR_0, p127 */
|
||||
#define STATE3D_COLOR_FACTOR_CMD(stage) (CMD_3D | (0x1d<<24) | ((0x90 + (stage))<<16))
|
||||
|
||||
/* STATE3D_CONSTANT_BLEND_COLOR, p128 */
|
||||
#define STATE3D_CONST_BLEND_COLOR_CMD (CMD_3D | (0x1d<<24) | (0x88<<16))
|
||||
|
||||
/* STATE3D_DEFAULT_DIFFUSE, p128 */
|
||||
#define STATE3D_DFLT_DIFFUSE_CMD (CMD_3D | (0x1d<<24) | (0x99<<16))
|
||||
|
||||
/* STATE3D_DEFAULT_SPECULAR, p129 */
|
||||
#define STATE3D_DFLT_SPEC_CMD (CMD_3D | (0x1d<<24) | (0x9a<<16))
|
||||
|
||||
/* STATE3D_DEFAULT_Z, p129 */
|
||||
#define STATE3D_DFLT_Z_CMD (CMD_3D | (0x1d<<24) | (0x98<<16))
|
||||
|
||||
/* STATE3D_DEST_BUFFER_VARIABLES, p130 */
|
||||
#define STATE3D_DST_BUF_VARS_CMD (CMD_3D | (0x1d<<24) | (0x85<<16))
|
||||
/* Dword 1 */
|
||||
#define DSTORG_HORT_BIAS(x) ((x)<<20)
|
||||
#define DSTORG_VERT_BIAS(x) ((x)<<16)
|
||||
#define COLOR_4_2_2_CHNL_WRT_ALL 0
|
||||
#define COLOR_4_2_2_CHNL_WRT_Y (1<<12)
|
||||
#define COLOR_4_2_2_CHNL_WRT_CR (2<<12)
|
||||
#define COLOR_4_2_2_CHNL_WRT_CB (3<<12)
|
||||
#define COLOR_4_2_2_CHNL_WRT_CRCB (4<<12)
|
||||
#define COLR_BUF_8BIT 0
|
||||
#define COLR_BUF_RGB555 (1<<8)
|
||||
#define COLR_BUF_RGB565 (2<<8)
|
||||
#define COLR_BUF_ARGB8888 (3<<8)
|
||||
#define DEPTH_IS_Z 0
|
||||
#define DEPTH_IS_W (1<<6)
|
||||
#define DEPTH_FRMT_16_FIXED 0
|
||||
#define DEPTH_FRMT_16_FLOAT (1<<2)
|
||||
#define DEPTH_FRMT_24_FIXED_8_OTHER (2<<2)
|
||||
#define DEPTH_FRMT_24_FLOAT_8_OTHER (3<<2)
|
||||
#define VERT_LINE_STRIDE_1 (1<<1)
|
||||
#define VERT_LINE_STRIDE_0 0
|
||||
#define VERT_LINE_STRIDE_OFS_1 1
|
||||
#define VERT_LINE_STRIDE_OFS_0 0
|
||||
|
||||
/* STATE3D_DRAWING_RECTANGLE, p133 */
|
||||
#define STATE3D_DRAW_RECT_CMD (CMD_3D|(0x1d<<24)|(0x80<<16)|3)
|
||||
/* Dword 1 */
|
||||
#define DRAW_RECT_DIS_DEPTH_OFS (1<<30)
|
||||
#define DRAW_DITHER_OFS_X(x) ((x)<<26)
|
||||
#define DRAW_DITHER_OFS_Y(x) ((x)<<24)
|
||||
/* Dword 2 */
|
||||
#define DRAW_YMIN(x) ((x)<<16)
|
||||
#define DRAW_XMIN(x) (x)
|
||||
/* Dword 3 */
|
||||
#define DRAW_YMAX(x) ((x)<<16)
|
||||
#define DRAW_XMAX(x) (x)
|
||||
/* Dword 4 */
|
||||
#define DRAW_YORG(x) ((x)<<16)
|
||||
#define DRAW_XORG(x) (x)
|
||||
|
||||
/* STATE3D_ENABLES_1, p136 */
|
||||
#define STATE3D_ENABLES_1_CMD (CMD_3D|(0x3<<24))
|
||||
#define ENABLE_LOGIC_OP_MASK ((1<<23)|(1<<22))
|
||||
#define ENABLE_LOGIC_OP ((1<<23)|(1<<22))
|
||||
#define DISABLE_LOGIC_OP (1<<23)
|
||||
#define ENABLE_STENCIL_TEST ((1<<21)|(1<<20))
|
||||
#define DISABLE_STENCIL_TEST (1<<21)
|
||||
#define ENABLE_DEPTH_BIAS ((1<<11)|(1<<10))
|
||||
#define DISABLE_DEPTH_BIAS (1<<11)
|
||||
#define ENABLE_SPEC_ADD_MASK ((1<<9)|(1<<8))
|
||||
#define ENABLE_SPEC_ADD ((1<<9)|(1<<8))
|
||||
#define DISABLE_SPEC_ADD (1<<9)
|
||||
#define ENABLE_DIS_FOG_MASK ((1<<7)|(1<<6))
|
||||
/* prefixed I830 because ENABLE_FOG defined elsewhere */
|
||||
#define I830_ENABLE_FOG ((1<<7)|(1<<6))
|
||||
#define I830_DISABLE_FOG (1<<7)
|
||||
#define ENABLE_DIS_ALPHA_TEST_MASK ((1<<5)|(1<<4))
|
||||
#define ENABLE_ALPHA_TEST ((1<<5)|(1<<4))
|
||||
#define DISABLE_ALPHA_TEST (1<<5)
|
||||
#define ENABLE_DIS_CBLEND_MASK ((1<<3)|(1<<2))
|
||||
#define ENABLE_COLOR_BLEND ((1<<3)|(1<<2))
|
||||
#define DISABLE_COLOR_BLEND (1<<3)
|
||||
#define ENABLE_DIS_DEPTH_TEST_MASK ((1<<1)|1)
|
||||
#define ENABLE_DEPTH_TEST ((1<<1)|1)
|
||||
#define DISABLE_DEPTH_TEST (1<<1)
|
||||
|
||||
/* STATE3D_ENABLES_2, p138 */
|
||||
#define STATE3D_ENABLES_2_CMD (CMD_3D|(0x4<<24))
|
||||
#define ENABLE_STENCIL_WRITE ((1<<21)|(1<<20))
|
||||
#define DISABLE_STENCIL_WRITE (1<<21)
|
||||
#define ENABLE_TEX_CACHE ((1<<17)|(1<<16))
|
||||
#define DISABLE_TEX_CACHE (1<<17)
|
||||
#define ENABLE_DITHER ((1<<9)|(1<<8))
|
||||
#define DISABLE_DITHER (1<<9)
|
||||
#define ENABLE_COLOR_MASK (1<<10)
|
||||
#define WRITEMASK_ALPHA (1<<7)
|
||||
#define WRITEMASK_ALPHA_SHIFT 7
|
||||
#define WRITEMASK_RED (1<<6)
|
||||
#define WRITEMASK_RED_SHIFT 6
|
||||
#define WRITEMASK_GREEN (1<<5)
|
||||
#define WRITEMASK_GREEN_SHIFT 5
|
||||
#define WRITEMASK_BLUE (1<<4)
|
||||
#define WRITEMASK_BLUE_SHIFT 4
|
||||
#define WRITEMASK_MASK ((1<<4)|(1<<5)|(1<<6)|(1<<7))
|
||||
#define ENABLE_COLOR_WRITE ((1<<3)|(1<<2))
|
||||
#define DISABLE_COLOR_WRITE (1<<3)
|
||||
#define ENABLE_DIS_DEPTH_WRITE_MASK 0x3
|
||||
#define ENABLE_DEPTH_WRITE ((1<<1)|1)
|
||||
#define DISABLE_DEPTH_WRITE (1<<1)
|
||||
|
||||
/* STATE3D_FOG_COLOR, p139 */
|
||||
#define STATE3D_FOG_COLOR_CMD (CMD_3D|(0x15<<24))
|
||||
#define FOG_COLOR_RED(x) ((x)<<16)
|
||||
#define FOG_COLOR_GREEN(x) ((x)<<8)
|
||||
#define FOG_COLOR_BLUE(x) (x)
|
||||
|
||||
/* STATE3D_FOG_MODE, p140 */
|
||||
#define STATE3D_FOG_MODE_CMD (CMD_3D|(0x1d<<24)|(0x89<<16)|2)
|
||||
/* Dword 1 */
|
||||
#define FOGFUNC_ENABLE (1<<31)
|
||||
#define FOGFUNC_VERTEX 0
|
||||
#define FOGFUNC_PIXEL_EXP (1<<28)
|
||||
#define FOGFUNC_PIXEL_EXP2 (2<<28)
|
||||
#define FOGFUNC_PIXEL_LINEAR (3<<28)
|
||||
#define FOGSRC_INDEX_Z (1<<27)
|
||||
#define FOGSRC_INDEX_W ((1<<27)|(1<<25))
|
||||
#define FOG_LINEAR_CONST (1<<24)
|
||||
#define FOG_CONST_1(x) ((x)<<4)
|
||||
#define ENABLE_FOG_DENSITY (1<<23)
|
||||
/* Dword 2 */
|
||||
#define FOG_CONST_2(x) (x)
|
||||
/* Dword 3 */
|
||||
#define FOG_DENSITY(x) (x)
|
||||
|
||||
/* STATE3D_INDEPENDENT_ALPHA_BLEND, p142 */
|
||||
#define STATE3D_INDPT_ALPHA_BLEND_CMD (CMD_3D|(0x0b<<24))
|
||||
#define ENABLE_INDPT_ALPHA_BLEND ((1<<23)|(1<<22))
|
||||
#define DISABLE_INDPT_ALPHA_BLEND (1<<23)
|
||||
#define ALPHA_BLENDFUNC_MASK 0x3f0000
|
||||
#define ENABLE_ALPHA_BLENDFUNC (1<<21)
|
||||
#define ABLENDFUNC_ADD 0
|
||||
#define ABLENDFUNC_SUB (1<<16)
|
||||
#define ABLENDFUNC_RVSE_SUB (2<<16)
|
||||
#define ABLENDFUNC_MIN (3<<16)
|
||||
#define ABLENDFUNC_MAX (4<<16)
|
||||
#define SRC_DST_ABLEND_MASK 0xfff
|
||||
#define ENABLE_SRC_ABLEND_FACTOR (1<<11)
|
||||
#define SRC_ABLEND_FACT(x) ((x)<<6)
|
||||
#define ENABLE_DST_ABLEND_FACTOR (1<<5)
|
||||
#define DST_ABLEND_FACT(x) (x)
|
||||
|
||||
#define BLEND_STATE_MASK (ALPHA_BLENDFUNC_MASK | SRC_DST_ABLEND_MASK)
|
||||
|
||||
#define BLENDFACT_ZERO 0x01
|
||||
#define BLENDFACT_ONE 0x02
|
||||
#define BLENDFACT_SRC_COLR 0x03
|
||||
#define BLENDFACT_INV_SRC_COLR 0x04
|
||||
#define BLENDFACT_SRC_ALPHA 0x05
|
||||
#define BLENDFACT_INV_SRC_ALPHA 0x06
|
||||
#define BLENDFACT_DST_ALPHA 0x07
|
||||
#define BLENDFACT_INV_DST_ALPHA 0x08
|
||||
#define BLENDFACT_DST_COLR 0x09
|
||||
#define BLENDFACT_INV_DST_COLR 0x0a
|
||||
#define BLENDFACT_SRC_ALPHA_SATURATE 0x0b
|
||||
#define BLENDFACT_CONST_COLOR 0x0c
|
||||
#define BLENDFACT_INV_CONST_COLOR 0x0d
|
||||
#define BLENDFACT_CONST_ALPHA 0x0e
|
||||
#define BLENDFACT_INV_CONST_ALPHA 0x0f
|
||||
|
||||
/* STATE3D_MAP_BLEND_ARG, p152 */
|
||||
#define STATE3D_MAP_BLEND_ARG_CMD(stage) (CMD_3D|(0x0e<<24)|((stage)<<20))
|
||||
|
||||
#define TEXPIPE_COLOR 0
|
||||
#define TEXPIPE_ALPHA (1<<18)
|
||||
#define TEXPIPE_KILL (2<<18)
|
||||
#define TEXBLEND_ARG0 0
|
||||
#define TEXBLEND_ARG1 (1<<15)
|
||||
#define TEXBLEND_ARG2 (2<<15)
|
||||
#define TEXBLEND_ARG3 (3<<15)
|
||||
#define TEXBLENDARG_MODIFY_PARMS (1<<6)
|
||||
#define TEXBLENDARG_REPLICATE_ALPHA (1<<5)
|
||||
#define TEXBLENDARG_INV_ARG (1<<4)
|
||||
#define TEXBLENDARG_ONE 0
|
||||
#define TEXBLENDARG_FACTOR 0x01
|
||||
#define TEXBLENDARG_ACCUM 0x02
|
||||
#define TEXBLENDARG_DIFFUSE 0x03
|
||||
#define TEXBLENDARG_SPEC 0x04
|
||||
#define TEXBLENDARG_CURRENT 0x05
|
||||
#define TEXBLENDARG_TEXEL0 0x06
|
||||
#define TEXBLENDARG_TEXEL1 0x07
|
||||
#define TEXBLENDARG_TEXEL2 0x08
|
||||
#define TEXBLENDARG_TEXEL3 0x09
|
||||
#define TEXBLENDARG_FACTOR_N 0x0e
|
||||
|
||||
/* STATE3D_MAP_BLEND_OP, p155 */
|
||||
#define STATE3D_MAP_BLEND_OP_CMD(stage) (CMD_3D|(0x0d<<24)|((stage)<<20))
|
||||
#if 0
|
||||
#define TEXPIPE_COLOR 0
|
||||
#define TEXPIPE_ALPHA (1<<18)
|
||||
#define TEXPIPE_KILL (2<<18)
|
||||
#endif
|
||||
#define ENABLE_TEXOUTPUT_WRT_SEL (1<<17)
|
||||
#define TEXOP_OUTPUT_CURRENT 0
|
||||
#define TEXOP_OUTPUT_ACCUM (1<<15)
|
||||
#define ENABLE_TEX_CNTRL_STAGE ((1<<12)|(1<<11))
|
||||
#define DISABLE_TEX_CNTRL_STAGE (1<<12)
|
||||
#define TEXOP_SCALE_SHIFT 9
|
||||
#define TEXOP_SCALE_1X (0 << TEXOP_SCALE_SHIFT)
|
||||
#define TEXOP_SCALE_2X (1 << TEXOP_SCALE_SHIFT)
|
||||
#define TEXOP_SCALE_4X (2 << TEXOP_SCALE_SHIFT)
|
||||
#define TEXOP_MODIFY_PARMS (1<<8)
|
||||
#define TEXOP_LAST_STAGE (1<<7)
|
||||
#define TEXBLENDOP_KILLPIXEL 0x02
|
||||
#define TEXBLENDOP_ARG1 0x01
|
||||
#define TEXBLENDOP_ARG2 0x02
|
||||
#define TEXBLENDOP_MODULATE 0x03
|
||||
#define TEXBLENDOP_ADD 0x06
|
||||
#define TEXBLENDOP_ADDSIGNED 0x07
|
||||
#define TEXBLENDOP_BLEND 0x08
|
||||
#define TEXBLENDOP_BLEND_AND_ADD 0x09
|
||||
#define TEXBLENDOP_SUBTRACT 0x0a
|
||||
#define TEXBLENDOP_DOT3 0x0b
|
||||
#define TEXBLENDOP_DOT4 0x0c
|
||||
#define TEXBLENDOP_MODULATE_AND_ADD 0x0d
|
||||
#define TEXBLENDOP_MODULATE_2X_AND_ADD 0x0e
|
||||
#define TEXBLENDOP_MODULATE_4X_AND_ADD 0x0f
|
||||
|
||||
/* STATE3D_MAP_BUMP_TABLE, p160 TODO */
|
||||
/* STATE3D_MAP_COLOR_CHROMA_KEY, p161 TODO */
|
||||
|
||||
/* STATE3D_MAP_COORD_SET_BINDINGS, p162 */
|
||||
#define STATE3D_MAP_COORD_SETBIND_CMD (CMD_3D|(0x1d<<24)|(0x02<<16))
|
||||
#define TEXBIND_MASK3 ((1<<15)|(1<<14)|(1<<13)|(1<<12))
|
||||
#define TEXBIND_MASK2 ((1<<11)|(1<<10)|(1<<9)|(1<<8))
|
||||
#define TEXBIND_MASK1 ((1<<7)|(1<<6)|(1<<5)|(1<<4))
|
||||
#define TEXBIND_MASK0 ((1<<3)|(1<<2)|(1<<1)|1)
|
||||
|
||||
#define TEXBIND_SET3(x) ((x)<<12)
|
||||
#define TEXBIND_SET2(x) ((x)<<8)
|
||||
#define TEXBIND_SET1(x) ((x)<<4)
|
||||
#define TEXBIND_SET0(x) (x)
|
||||
|
||||
#define TEXCOORDSRC_KEEP 0
|
||||
#define TEXCOORDSRC_DEFAULT 0x01
|
||||
#define TEXCOORDSRC_VTXSET_0 0x08
|
||||
#define TEXCOORDSRC_VTXSET_1 0x09
|
||||
#define TEXCOORDSRC_VTXSET_2 0x0a
|
||||
#define TEXCOORDSRC_VTXSET_3 0x0b
|
||||
#define TEXCOORDSRC_VTXSET_4 0x0c
|
||||
#define TEXCOORDSRC_VTXSET_5 0x0d
|
||||
#define TEXCOORDSRC_VTXSET_6 0x0e
|
||||
#define TEXCOORDSRC_VTXSET_7 0x0f
|
||||
|
||||
#define MAP_UNIT(unit) ((unit)<<16)
|
||||
#define MAP_UNIT_MASK (3<<16)
|
||||
|
||||
/* STATE3D_MAP_COORD_SETS, p164 */
|
||||
#define STATE3D_MAP_COORD_SET_CMD (CMD_3D|(0x1c<<24)|(0x01<<19))
|
||||
#define ENABLE_TEXCOORD_PARAMS (1<<15)
|
||||
#define TEXCOORDS_ARE_NORMAL (1<<14)
|
||||
#define TEXCOORDS_ARE_IN_TEXELUNITS 0
|
||||
#define TEXCOORDTYPE_CARTESIAN 0
|
||||
#define TEXCOORDTYPE_HOMOGENEOUS (1<<11)
|
||||
#define TEXCOORDTYPE_VECTOR (2<<11)
|
||||
#define ENABLE_ADDR_V_CNTL (1<<7)
|
||||
#define ENABLE_ADDR_U_CNTL (1<<3)
|
||||
#define TEXCOORD_ADDR_V_MODE(x) ((x)<<4)
|
||||
#define TEXCOORD_ADDR_U_MODE(x) (x)
|
||||
#define TEXCOORDMODE_WRAP 0
|
||||
#define TEXCOORDMODE_MIRROR 1
|
||||
#define TEXCOORDMODE_CLAMP 2
|
||||
#define TEXCOORDMODE_WRAP_SHORTEST 3
|
||||
#define TEXCOORDMODE_CLAMP_BORDER 4
|
||||
#define TEXCOORD_ADDR_V_MASK 0x70
|
||||
#define TEXCOORD_ADDR_U_MASK 0x7
|
||||
|
||||
/* STATE3D_MAP_CUBE, p168 TODO */
|
||||
#define STATE3D_MAP_CUBE (CMD_3D|(0x1c<<24)|(0x0a<<19))
|
||||
#define CUBE_NEGX_ENABLE (1<<5)
|
||||
#define CUBE_POSX_ENABLE (1<<4)
|
||||
#define CUBE_NEGY_ENABLE (1<<3)
|
||||
#define CUBE_POSY_ENABLE (1<<2)
|
||||
#define CUBE_NEGZ_ENABLE (1<<1)
|
||||
#define CUBE_POSZ_ENABLE (1<<0)
|
||||
|
||||
|
||||
/* STATE3D_MODES_1, p190 */
|
||||
#define STATE3D_MODES_1_CMD (CMD_3D|(0x08<<24))
|
||||
#define BLENDFUNC_MASK 0x3f0000
|
||||
#define ENABLE_COLR_BLND_FUNC (1<<21)
|
||||
#define BLENDFUNC_ADD 0
|
||||
#define BLENDFUNC_SUB (1<<16)
|
||||
#define BLENDFUNC_RVRSE_SUB (2<<16)
|
||||
#define BLENDFUNC_MIN (3<<16)
|
||||
#define BLENDFUNC_MAX (4<<16)
|
||||
#define SRC_DST_BLND_MASK 0xfff
|
||||
#define ENABLE_SRC_BLND_FACTOR (1<<11)
|
||||
#define ENABLE_DST_BLND_FACTOR (1<<5)
|
||||
#define SRC_BLND_FACT(x) ((x)<<6)
|
||||
#define DST_BLND_FACT(x) (x)
|
||||
|
||||
/* Use the blendfact defines for BLND_FACTOR macros */
|
||||
#if 0
|
||||
#define BLENDFACT_ZERO 0x01
|
||||
#define BLENDFACT_ONE 0x02
|
||||
#define BLENDFACT_SRC_COLR 0x03
|
||||
#define BLENDFACT_INV_SRC_COLR 0x04
|
||||
#define BLENDFACT_SRC_ALPHA 0x05
|
||||
#define BLENDFACT_INV_SRC_ALPHA 0x06
|
||||
#define BLENDFACT_DST_ALPHA 0x07
|
||||
#define BLENDFACT_INV_DST_ALPHA 0x08
|
||||
#define BLENDFACT_CONST_ALPHA 0x0e
|
||||
#define BLENDFACT_INV_CONST_ALPHA 0x0f
|
||||
#endif
|
||||
|
||||
/* STATE3D_MODES_2, p192 */
|
||||
#define STATE3D_MODES_2_CMD (CMD_3D|(0x0f<<24))
|
||||
#define ENABLE_GLOBAL_DEPTH_BIAS (1<<22)
|
||||
#define GLOBAL_DEPTH_BIAS(x) ((x)<<14)
|
||||
#define ENABLE_ALPHA_TEST_FUNC (1<<13)
|
||||
#define ENABLE_ALPHA_REF_VALUE (1<<8)
|
||||
#define ALPHA_TEST_FUNC(x) ((x)<<9)
|
||||
#define ALPHA_REF_VALUE(x) (x)
|
||||
|
||||
#define ALPHA_TEST_REF_MASK 0x3fff
|
||||
#define COMPAREFUNC_ALWAYS 0
|
||||
#define COMPAREFUNC_NEVER 0x1
|
||||
#define COMPAREFUNC_LESS 0x2
|
||||
#define COMPAREFUNC_EQUAL 0x3
|
||||
#define COMPAREFUNC_LEQUAL 0x4
|
||||
#define COMPAREFUNC_GREATER 0x5
|
||||
#define COMPAREFUNC_NOTEQUAL 0x6
|
||||
#define COMPAREFUNC_GEQUAL 0x7
|
||||
|
||||
/* STATE3D_MODES_3, p193 */
|
||||
#define STATE3D_MODES_3_CMD (CMD_3D|(0x02<<24))
|
||||
#define DEPTH_TEST_FUNC_MASK 0x1f0000
|
||||
#define ENABLE_DEPTH_TEST_FUNC (1<<20)
|
||||
/* Uses COMPAREFUNC */
|
||||
#define DEPTH_TEST_FUNC(x) ((x)<<16)
|
||||
#define ENABLE_ALPHA_SHADE_MODE (1<<11)
|
||||
#define ENABLE_FOG_SHADE_MODE (1<<9)
|
||||
#define ENABLE_SPEC_SHADE_MODE (1<<7)
|
||||
#define ENABLE_COLOR_SHADE_MODE (1<<5)
|
||||
#define ALPHA_SHADE_MODE(x) ((x)<<10)
|
||||
#define FOG_SHADE_MODE(x) ((x)<<8)
|
||||
#define SPEC_SHADE_MODE(x) ((x)<<6)
|
||||
#define COLOR_SHADE_MODE(x) ((x)<<4)
|
||||
#define CULLMODE_MASK 0xf
|
||||
#define ENABLE_CULL_MODE (1<<3)
|
||||
#define CULLMODE_BOTH 0
|
||||
#define CULLMODE_NONE 1
|
||||
#define CULLMODE_CW 2
|
||||
#define CULLMODE_CCW 3
|
||||
|
||||
#define SHADE_MODE_LINEAR 0
|
||||
#define SHADE_MODE_FLAT 0x1
|
||||
|
||||
/* STATE3D_MODES_4, p195 */
|
||||
#define STATE3D_MODES_4_CMD (CMD_3D|(0x16<<24))
|
||||
#define ENABLE_LOGIC_OP_FUNC (1<<23)
|
||||
#define LOGIC_OP_FUNC(x) ((x)<<18)
|
||||
#define LOGICOP_MASK ((1<<18)|(1<<19)|(1<<20)|(1<<21))
|
||||
#define LOGICOP_CLEAR 0
|
||||
#define LOGICOP_NOR 0x1
|
||||
#define LOGICOP_AND_INV 0x2
|
||||
#define LOGICOP_COPY_INV 0x3
|
||||
#define LOGICOP_AND_RVRSE 0x4
|
||||
#define LOGICOP_INV 0x5
|
||||
#define LOGICOP_XOR 0x6
|
||||
#define LOGICOP_NAND 0x7
|
||||
#define LOGICOP_AND 0x8
|
||||
#define LOGICOP_EQUIV 0x9
|
||||
#define LOGICOP_NOOP 0xa
|
||||
#define LOGICOP_OR_INV 0xb
|
||||
#define LOGICOP_COPY 0xc
|
||||
#define LOGICOP_OR_RVRSE 0xd
|
||||
#define LOGICOP_OR 0xe
|
||||
#define LOGICOP_SET 0xf
|
||||
#define MODE4_ENABLE_STENCIL_TEST_MASK ((1<<17)|(0xff00))
|
||||
#define ENABLE_STENCIL_TEST_MASK (1<<17)
|
||||
#define STENCIL_TEST_MASK(x) ((x)<<8)
|
||||
#define MODE4_ENABLE_STENCIL_WRITE_MASK ((1<<16)|(0x00ff))
|
||||
#define ENABLE_STENCIL_WRITE_MASK (1<<16)
|
||||
#define STENCIL_WRITE_MASK(x) (x)
|
||||
|
||||
/* STATE3D_MODES_5, p196 */
|
||||
#define STATE3D_MODES_5_CMD (CMD_3D|(0x0c<<24))
|
||||
#define ENABLE_SPRITE_POINT_TEX (1<<23)
|
||||
#define SPRITE_POINT_TEX_ON (1<<22)
|
||||
#define SPRITE_POINT_TEX_OFF 0
|
||||
#define FLUSH_RENDER_CACHE (1<<18)
|
||||
#define FLUSH_TEXTURE_CACHE (1<<16)
|
||||
#define FIXED_LINE_WIDTH_MASK 0xfc00
|
||||
#define ENABLE_FIXED_LINE_WIDTH (1<<15)
|
||||
#define FIXED_LINE_WIDTH(x) ((x)<<10)
|
||||
#define FIXED_POINT_WIDTH_MASK 0x3ff
|
||||
#define ENABLE_FIXED_POINT_WIDTH (1<<9)
|
||||
#define FIXED_POINT_WIDTH(x) (x)
|
||||
|
||||
/* STATE3D_RASTERIZATION_RULES, p198 */
|
||||
#define STATE3D_RASTER_RULES_CMD (CMD_3D|(0x07<<24))
|
||||
#define ENABLE_POINT_RASTER_RULE (1<<15)
|
||||
#define OGL_POINT_RASTER_RULE (1<<13)
|
||||
#define ENABLE_LINE_STRIP_PROVOKE_VRTX (1<<8)
|
||||
#define ENABLE_TRI_FAN_PROVOKE_VRTX (1<<5)
|
||||
#define ENABLE_TRI_STRIP_PROVOKE_VRTX (1<<2)
|
||||
#define LINE_STRIP_PROVOKE_VRTX(x) ((x)<<6)
|
||||
#define TRI_FAN_PROVOKE_VRTX(x) ((x)<<3)
|
||||
#define TRI_STRIP_PROVOKE_VRTX(x) (x)
|
||||
|
||||
/* STATE3D_SCISSOR_ENABLE, p200 */
|
||||
#define STATE3D_SCISSOR_ENABLE_CMD (CMD_3D|(0x1c<<24)|(0x10<<19))
|
||||
#define ENABLE_SCISSOR_RECT ((1<<1) | 1)
|
||||
#define DISABLE_SCISSOR_RECT (1<<1)
|
||||
|
||||
/* STATE3D_SCISSOR_RECTANGLE_0, p201 */
|
||||
#define STATE3D_SCISSOR_RECT_0_CMD (CMD_3D|(0x1d<<24)|(0x81<<16)|1)
|
||||
/* Dword 1 */
|
||||
#define SCISSOR_RECT_0_YMIN(x) ((x)<<16)
|
||||
#define SCISSOR_RECT_0_XMIN(x) (x)
|
||||
/* Dword 2 */
|
||||
#define SCISSOR_RECT_0_YMAX(x) ((x)<<16)
|
||||
#define SCISSOR_RECT_0_XMAX(x) (x)
|
||||
|
||||
/* STATE3D_STENCIL_TEST, p202 */
|
||||
#define STATE3D_STENCIL_TEST_CMD (CMD_3D|(0x09<<24))
|
||||
#define ENABLE_STENCIL_PARMS (1<<23)
|
||||
#define STENCIL_OPS_MASK (0xffc000)
|
||||
#define STENCIL_FAIL_OP(x) ((x)<<20)
|
||||
#define STENCIL_PASS_DEPTH_FAIL_OP(x) ((x)<<17)
|
||||
#define STENCIL_PASS_DEPTH_PASS_OP(x) ((x)<<14)
|
||||
|
||||
#define STENCILOP_KEEP 0
|
||||
#define STENCILOP_ZERO 0x1
|
||||
#define STENCILOP_REPLACE 0x2
|
||||
#define STENCILOP_INCRSAT 0x3
|
||||
#define STENCILOP_DECRSAT 0x4
|
||||
#define STENCILOP_INCR 0x5
|
||||
#define STENCILOP_DECR 0x6
|
||||
#define STENCILOP_INVERT 0x7
|
||||
|
||||
#define ENABLE_STENCIL_TEST_FUNC_MASK ((1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9))
|
||||
#define ENABLE_STENCIL_TEST_FUNC (1<<13)
|
||||
/* Uses COMPAREFUNC */
|
||||
#define STENCIL_TEST_FUNC(x) ((x)<<9)
|
||||
#define STENCIL_REF_VALUE_MASK ((1<<8)|0xff)
|
||||
#define ENABLE_STENCIL_REF_VALUE (1<<8)
|
||||
#define STENCIL_REF_VALUE(x) (x)
|
||||
|
||||
/* STATE3D_VERTEX_FORMAT, p204 */
|
||||
#define STATE3D_VERTEX_FORMAT_CMD (CMD_3D|(0x05<<24))
|
||||
#define VRTX_HAS_POINT_WIDTH (1<<12)
|
||||
#define VRTX_TEX_COORD_COUNT(x) ((x)<<8)
|
||||
#define VRTX_HAS_SPEC (1<<7)
|
||||
#define VRTX_HAS_DIFFUSE (1<<6)
|
||||
#define VRTX_HAS_DEPTH_OFS (1<<5)
|
||||
#define VRTX_HAS_XYZ (1<<1)
|
||||
#define VRTX_HAS_XYZW (2<<1)
|
||||
#define VRTX_HAS_XY (3<<1)
|
||||
#define VRTX_HAS_XYW (4<<1)
|
||||
|
||||
/* STATE3D_VERTEX_FORMAT_2, p206 */
|
||||
#define STATE3D_VERTEX_FORMAT_2_CMD (CMD_3D|(0x0a<<24))
|
||||
#define VRTX_TEX_SET_7_FMT(x) ((x)<<14)
|
||||
#define VRTX_TEX_SET_6_FMT(x) ((x)<<12)
|
||||
#define VRTX_TEX_SET_5_FMT(x) ((x)<<10)
|
||||
#define VRTX_TEX_SET_4_FMT(x) ((x)<<8)
|
||||
#define VRTX_TEX_SET_3_FMT(x) ((x)<<6)
|
||||
#define VRTX_TEX_SET_2_FMT(x) ((x)<<4)
|
||||
#define VRTX_TEX_SET_1_FMT(x) ((x)<<2)
|
||||
#define VRTX_TEX_SET_0_FMT(x) (x)
|
||||
|
||||
#define TEXCOORDFMT_2D 0
|
||||
#define TEXCOORDFMT_3D 1
|
||||
#define TEXCOORDFMT_4D 2
|
||||
#define TEXCOORDFMT_1D 3
|
||||
|
||||
/*New stuff picked up along the way */
|
||||
|
||||
#define MLC_LOD_BIAS_MASK ((1<<7)-1)
|
||||
|
||||
|
||||
/* STATE3D_VERTEX_TRANSFORM, p207 */
|
||||
#define STATE3D_VERTEX_TRANS_CMD (CMD_3D|(0x1d<<24)|(0x8b<<16)|0)
|
||||
#define STATE3D_VERTEX_TRANS_MTX_CMD (CMD_3D|(0x1d<<24)|(0x8b<<16)|6)
|
||||
/* Dword 1 */
|
||||
#define ENABLE_VIEWPORT_TRANSFORM ((1<<31)|(1<<30))
|
||||
#define DISABLE_VIEWPORT_TRANSFORM (1<<31)
|
||||
#define ENABLE_PERSP_DIVIDE ((1<<29)|(1<<28))
|
||||
#define DISABLE_PERSP_DIVIDE (1<<29)
|
||||
#define VRTX_TRANS_LOAD_MATRICES 0x7421
|
||||
#define VRTX_TRANS_NO_LOAD_MATRICES 0x0000
|
||||
/* Dword 2 -> 7 are matrix elements */
|
||||
|
||||
/* STATE3D_W_STATE, p209 */
|
||||
#define STATE3D_W_STATE_CMD (CMD_3D|(0x1d<<24)|(0x8d<<16)|1)
|
||||
/* Dword 1 */
|
||||
#define MAGIC_W_STATE_DWORD1 0x00000008
|
||||
/* Dword 2 */
|
||||
#define WFAR_VALUE(x) (x)
|
||||
|
||||
/* if defining I830_ENABLE_4_TEXTURES, do it in i830_drm.h, too */
|
||||
|
||||
#define I830PACKCOLOR4444(r,g,b,a) \
|
||||
((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4))
|
||||
|
||||
#define I830PACKCOLOR1555(r,g,b,a) \
|
||||
((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
|
||||
((a) ? 0x8000 : 0))
|
||||
|
||||
#define I830PACKCOLOR565(r,g,b) \
|
||||
((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
|
||||
|
||||
#define I830PACKCOLOR8888(r,g,b,a) \
|
||||
((a<<24) | (r<<16) | (g<<8) | b)
|
||||
|
||||
|
||||
/* Stipple command, carried over from the i810, apparently:
|
||||
*/
|
||||
#define GFX_OP_STIPPLE ((0x3<<29)|(0x1d<<24)|(0x83<<16))
|
||||
#define ST1_ENABLE (1<<16)
|
||||
#define ST1_MASK (0xffff)
|
||||
|
||||
|
||||
|
||||
#define STATE3D_LOAD_STATE_IMMEDIATE_2 ((0x3<<29)|(0x1d<<24)|(0x03<<16))
|
||||
#define LOAD_TEXTURE_MAP0 (1<<11)
|
||||
|
||||
#define TM0S0_ADDRESS_MASK 0xfffffffc
|
||||
#define TM0S0_USE_FENCE (1<<1)
|
||||
|
||||
#define TM0S1_HEIGHT_SHIFT 21
|
||||
#define TM0S1_WIDTH_SHIFT 10
|
||||
#define TM0S1_PALETTE_SELECT (1<<9)
|
||||
#define TM0S1_MAPSURF_FORMAT_MASK (0x7 << 6)
|
||||
#define TM0S1_MAPSURF_FORMAT_SHIFT 6
|
||||
#define MAPSURF_8BIT_INDEXED (0<<6)
|
||||
#define MAPSURF_8BIT (1<<6)
|
||||
#define MAPSURF_16BIT (2<<6)
|
||||
#define MAPSURF_32BIT (3<<6)
|
||||
#define MAPSURF_411 (4<<6)
|
||||
#define MAPSURF_422 (5<<6)
|
||||
#define MAPSURF_COMPRESSED (6<<6)
|
||||
#define MAPSURF_4BIT_INDEXED (7<<6)
|
||||
#define TM0S1_MT_FORMAT_MASK (0x7 << 3)
|
||||
#define TM0S1_MT_FORMAT_SHIFT 3
|
||||
#define MT_4BIT_IDX_ARGB8888 (7<<3) /* SURFACE_4BIT_INDEXED */
|
||||
#define MT_8BIT_IDX_RGB565 (0<<3) /* SURFACE_8BIT_INDEXED */
|
||||
#define MT_8BIT_IDX_ARGB1555 (1<<3)
|
||||
#define MT_8BIT_IDX_ARGB4444 (2<<3)
|
||||
#define MT_8BIT_IDX_AY88 (3<<3)
|
||||
#define MT_8BIT_IDX_ABGR8888 (4<<3)
|
||||
#define MT_8BIT_IDX_BUMP_88DVDU (5<<3)
|
||||
#define MT_8BIT_IDX_BUMP_655LDVDU (6<<3)
|
||||
#define MT_8BIT_IDX_ARGB8888 (7<<3)
|
||||
#define MT_8BIT_I8 (0<<3) /* SURFACE_8BIT */
|
||||
#define MT_8BIT_L8 (1<<3)
|
||||
#define MT_16BIT_RGB565 (0<<3) /* SURFACE_16BIT */
|
||||
#define MT_16BIT_ARGB1555 (1<<3)
|
||||
#define MT_16BIT_ARGB4444 (2<<3)
|
||||
#define MT_16BIT_AY88 (3<<3)
|
||||
#define MT_16BIT_DIB_ARGB1555_8888 (4<<3)
|
||||
#define MT_16BIT_BUMP_88DVDU (5<<3)
|
||||
#define MT_16BIT_BUMP_655LDVDU (6<<3)
|
||||
#define MT_16BIT_DIB_RGB565_8888 (7<<3)
|
||||
#define MT_32BIT_ARGB8888 (0<<3) /* SURFACE_32BIT */
|
||||
#define MT_32BIT_ABGR8888 (1<<3)
|
||||
#define MT_32BIT_BUMP_XLDVDU_8888 (6<<3)
|
||||
#define MT_32BIT_DIB_8888 (7<<3)
|
||||
#define MT_411_YUV411 (0<<3) /* SURFACE_411 */
|
||||
#define MT_422_YCRCB_SWAPY (0<<3) /* SURFACE_422 */
|
||||
#define MT_422_YCRCB_NORMAL (1<<3)
|
||||
#define MT_422_YCRCB_SWAPUV (2<<3)
|
||||
#define MT_422_YCRCB_SWAPUVY (3<<3)
|
||||
#define MT_COMPRESS_DXT1 (0<<3) /* SURFACE_COMPRESSED */
|
||||
#define MT_COMPRESS_DXT2_3 (1<<3)
|
||||
#define MT_COMPRESS_DXT4_5 (2<<3)
|
||||
#define MT_COMPRESS_FXT1 (3<<3)
|
||||
#define TM0S1_COLORSPACE_CONVERSION (1 << 2)
|
||||
#define TM0S1_TILED_SURFACE (1 << 1)
|
||||
#define TM0S1_TILE_WALK (1 << 0)
|
||||
|
||||
#define TM0S2_PITCH_SHIFT 21
|
||||
#define TM0S2_CUBE_FACE_ENA_SHIFT 15
|
||||
#define TM0S2_MAP_FORMAT (1<<14)
|
||||
#define TM0S2_VERTICAL_LINE_STRIDE (1<<13)
|
||||
#define TM0S2_VERITCAL_LINE_STRIDE_OFF (1<<12)
|
||||
#define TM0S2_OUTPUT_CHAN_SHIFT 10
|
||||
#define TM0S2_OUTPUT_CHAN_MASK (3<<10)
|
||||
|
||||
#define TM0S3_MIP_FILTER_MASK (0x3<<30)
|
||||
#define TM0S3_MIP_FILTER_SHIFT 30
|
||||
#define MIPFILTER_NONE 0
|
||||
#define MIPFILTER_NEAREST 1
|
||||
#define MIPFILTER_LINEAR 3
|
||||
#define TM0S3_MAG_FILTER_MASK (0x3<<28)
|
||||
#define TM0S3_MAG_FILTER_SHIFT 28
|
||||
#define TM0S3_MIN_FILTER_MASK (0x3<<26)
|
||||
#define TM0S3_MIN_FILTER_SHIFT 26
|
||||
#define FILTER_NEAREST 0
|
||||
#define FILTER_LINEAR 1
|
||||
#define FILTER_ANISOTROPIC 2
|
||||
|
||||
#define TM0S3_LOD_BIAS_SHIFT 17
|
||||
#define TM0S3_LOD_BIAS_MASK (0x1ff<<17)
|
||||
#define TM0S3_MAX_MIP_SHIFT 9
|
||||
#define TM0S3_MAX_MIP_MASK (0xff<<9)
|
||||
#define TM0S3_MIN_MIP_SHIFT 3
|
||||
#define TM0S3_MIN_MIP_MASK (0x3f<<3)
|
||||
#define TM0S3_KILL_PIXEL (1<<2)
|
||||
#define TM0S3_KEYED_FILTER (1<<1)
|
||||
#define TM0S3_CHROMA_KEY (1<<0)
|
||||
|
||||
|
||||
/* STATE3D_MAP_TEXEL_STREAM, p188 */
|
||||
#define STATE3D_MAP_TEX_STREAM_CMD (CMD_3D|(0x1c<<24)|(0x05<<19))
|
||||
#define DISABLE_TEX_STREAM_BUMP (1<<12)
|
||||
#define ENABLE_TEX_STREAM_BUMP ((1<<12)|(1<<11))
|
||||
#define TEX_MODIFY_UNIT_0 0
|
||||
#define TEX_MODIFY_UNIT_1 (1<<8)
|
||||
#define ENABLE_TEX_STREAM_COORD_SET (1<<7)
|
||||
#define TEX_STREAM_COORD_SET(x) ((x)<<4)
|
||||
#define ENABLE_TEX_STREAM_MAP_IDX (1<<3)
|
||||
#define TEX_STREAM_MAP_IDX(x) (x)
|
||||
|
|
@ -1,627 +0,0 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* **************************************************************************/
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_context.c,v 1.9 2003/02/06 04:18:00 dawes Exp $ */
|
||||
|
||||
/**
|
||||
* \file i830_context.c
|
||||
*
|
||||
* Heavily Based on I810 driver written by Keith Whitwell.
|
||||
*
|
||||
* \author Jeff Hartmann <jhartmann@2d3d.com>
|
||||
* \author Graeme Fisher <graeme@2d3d.co.za>
|
||||
* \author Abraham vd Merwe <abraham@2d3d.co.za>
|
||||
* \author Keith Whitwell <keith@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#include "glheader.h"
|
||||
#include "context.h"
|
||||
#include "matrix.h"
|
||||
#include "simple_list.h"
|
||||
#include "extensions.h"
|
||||
#include "framebuffer.h"
|
||||
#include "imports.h"
|
||||
|
||||
#include "swrast/swrast.h"
|
||||
#include "swrast_setup/swrast_setup.h"
|
||||
#include "tnl/tnl.h"
|
||||
#include "array_cache/acache.h"
|
||||
|
||||
#include "tnl/t_pipeline.h"
|
||||
|
||||
#include "drivers/common/driverfuncs.h"
|
||||
|
||||
#include "i830_screen.h"
|
||||
#include "i830_dri.h"
|
||||
|
||||
#include "i830_state.h"
|
||||
#include "i830_tex.h"
|
||||
#include "i830_span.h"
|
||||
#include "i830_tris.h"
|
||||
#include "i830_ioctl.h"
|
||||
|
||||
#include "drirenderbuffer.h"
|
||||
#include "utils.h"
|
||||
|
||||
#define need_GL_ARB_multisample
|
||||
#define need_GL_ARB_texture_compression
|
||||
#define need_GL_EXT_blend_color
|
||||
#define need_GL_EXT_blend_equation_separate
|
||||
#define need_GL_EXT_blend_func_separate
|
||||
#define need_GL_EXT_blend_minmax
|
||||
#define need_GL_EXT_fog_coord
|
||||
#define need_GL_EXT_secondary_color
|
||||
#include "extension_helper.h"
|
||||
|
||||
#include "xmlpool.h" /* for symbolic values of enum-type options */
|
||||
#ifndef I830_DEBUG
|
||||
int I830_DEBUG = (0);
|
||||
#endif
|
||||
|
||||
/***************************************
|
||||
* Mesa's Driver Functions
|
||||
***************************************/
|
||||
|
||||
#define DRIVER_DATE "20041007"
|
||||
|
||||
|
||||
static const GLubyte *i830DDGetString( GLcontext *ctx, GLenum name )
|
||||
{
|
||||
const char * chipset;
|
||||
static char buffer[128];
|
||||
|
||||
switch (name) {
|
||||
case GL_VENDOR:
|
||||
switch (I830_CONTEXT(ctx)->i830Screen->deviceID) {
|
||||
case PCI_CHIP_845_G:
|
||||
return (GLubyte *)"2d3D, Inc";
|
||||
|
||||
case PCI_CHIP_I830_M:
|
||||
return (GLubyte *)"VA Linux, Inc";
|
||||
|
||||
case PCI_CHIP_I855_GM:
|
||||
case PCI_CHIP_I865_G:
|
||||
default:
|
||||
return (GLubyte *)"Tungsten Graphics, Inc";
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_RENDERER:
|
||||
switch (I830_CONTEXT(ctx)->i830Screen->deviceID) {
|
||||
case PCI_CHIP_845_G:
|
||||
chipset = "Intel(R) 845G"; break;
|
||||
case PCI_CHIP_I830_M:
|
||||
chipset = "Intel(R) 830M"; break;
|
||||
case PCI_CHIP_I855_GM:
|
||||
chipset = "Intel(R) 852GM/855GM"; break;
|
||||
case PCI_CHIP_I865_G:
|
||||
chipset = "Intel(R) 865G"; break;
|
||||
default:
|
||||
chipset = "Unknown Intel Chipset"; break;
|
||||
}
|
||||
|
||||
(void) driGetRendererString( buffer, chipset, DRIVER_DATE, 0 );
|
||||
return (GLubyte *) buffer;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void i830BufferSize(GLframebuffer *buffer,
|
||||
GLuint *width, GLuint *height)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
/* Need to lock to make sure the driDrawable is uptodate. This
|
||||
* information is used to resize Mesa's software buffers, so it has
|
||||
* to be correct.
|
||||
*/
|
||||
LOCK_HARDWARE(imesa);
|
||||
*width = imesa->driDrawable->w;
|
||||
*height = imesa->driDrawable->h;
|
||||
UNLOCK_HARDWARE(imesa);
|
||||
}
|
||||
|
||||
|
||||
/* Extension strings exported by the i830 driver.
|
||||
*/
|
||||
const struct dri_extension card_extensions[] =
|
||||
{
|
||||
{ "GL_ARB_multisample", GL_ARB_multisample_functions },
|
||||
{ "GL_ARB_multitexture", NULL },
|
||||
{ "GL_ARB_texture_border_clamp", NULL },
|
||||
{ "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
|
||||
{ "GL_ARB_texture_env_add", NULL },
|
||||
{ "GL_ARB_texture_env_combine", NULL },
|
||||
{ "GL_ARB_texture_env_crossbar", NULL },
|
||||
{ "GL_ARB_texture_env_dot3", NULL },
|
||||
{ "GL_ARB_texture_mirrored_repeat", NULL },
|
||||
{ "GL_EXT_blend_color", GL_EXT_blend_color_functions },
|
||||
{ "GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions },
|
||||
{ "GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions },
|
||||
{ "GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions },
|
||||
{ "GL_EXT_blend_subtract", NULL },
|
||||
{ "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
|
||||
{ "GL_EXT_secondary_color", GL_EXT_secondary_color_functions },
|
||||
{ "GL_EXT_stencil_wrap", NULL },
|
||||
{ "GL_EXT_texture_edge_clamp", NULL },
|
||||
{ "GL_EXT_texture_env_combine", NULL },
|
||||
{ "GL_EXT_texture_env_dot3", NULL },
|
||||
{ "GL_EXT_texture_filter_anisotropic", NULL },
|
||||
{ "GL_EXT_texture_lod_bias", NULL },
|
||||
{ "GL_EXT_texture_rectangle", NULL },
|
||||
{ "GL_MESA_ycbcr_texture", NULL },
|
||||
{ "GL_NV_blend_square", NULL },
|
||||
{ "GL_SGIS_generate_mipmap", NULL },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
||||
extern const struct tnl_pipeline_stage _i830_render_stage;
|
||||
|
||||
static const struct tnl_pipeline_stage *i830_pipeline[] = {
|
||||
&_tnl_vertex_transform_stage,
|
||||
&_tnl_normal_transform_stage,
|
||||
&_tnl_lighting_stage,
|
||||
&_tnl_fog_coordinate_stage,
|
||||
&_tnl_texgen_stage,
|
||||
&_tnl_texture_transform_stage,
|
||||
/* REMOVE: point attenuation stage */
|
||||
#if 1
|
||||
&_i830_render_stage, /* ADD: unclipped rastersetup-to-dma */
|
||||
#endif
|
||||
&_tnl_render_stage,
|
||||
0,
|
||||
};
|
||||
|
||||
|
||||
static const struct dri_debug_control debug_control[] =
|
||||
{
|
||||
{ "fall", DEBUG_FALLBACKS },
|
||||
{ "tex", DEBUG_TEXTURE },
|
||||
{ "ioctl", DEBUG_IOCTL },
|
||||
{ "prim", DEBUG_PRIMS },
|
||||
{ "vert", DEBUG_VERTS },
|
||||
{ "state", DEBUG_STATE },
|
||||
{ "verb", DEBUG_VERBOSE },
|
||||
{ "dri", DEBUG_DRI },
|
||||
{ "dma", DEBUG_DMA },
|
||||
{ "san", DEBUG_SANITY },
|
||||
{ "sync", DEBUG_SYNC },
|
||||
{ "sleep", DEBUG_SLEEP },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
|
||||
GLboolean i830CreateContext( const __GLcontextModes *mesaVis,
|
||||
__DRIcontextPrivate *driContextPriv,
|
||||
void *sharedContextPrivate)
|
||||
{
|
||||
GLcontext *ctx , *shareCtx;
|
||||
i830ContextPtr imesa;
|
||||
__DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
|
||||
i830ScreenPrivate *screen = (i830ScreenPrivate *)sPriv->private;
|
||||
I830SAREAPtr saPriv=(I830SAREAPtr)
|
||||
(((GLubyte *)sPriv->pSAREA)+screen->sarea_priv_offset);
|
||||
struct dd_function_table functions;
|
||||
|
||||
/* Allocate i830 context */
|
||||
imesa = (i830ContextPtr) CALLOC_STRUCT(i830_context_t);
|
||||
if (!imesa)
|
||||
return GL_FALSE;
|
||||
|
||||
/* Init default driver functions then plug in our I830-specific functions
|
||||
* (the texture functions are especially important)
|
||||
*/
|
||||
_mesa_init_driver_functions(&functions);
|
||||
i830InitIoctlFuncs(&functions);
|
||||
i830InitTextureFuncs(&functions);
|
||||
|
||||
/* Allocate the Mesa context */
|
||||
if (sharedContextPrivate)
|
||||
shareCtx = ((i830ContextPtr) sharedContextPrivate)->glCtx;
|
||||
else
|
||||
shareCtx = NULL;
|
||||
imesa->glCtx = _mesa_create_context(mesaVis, shareCtx,
|
||||
&functions, (void*) imesa);
|
||||
if (!imesa->glCtx) {
|
||||
FREE(imesa);
|
||||
return GL_FALSE;
|
||||
}
|
||||
driContextPriv->driverPrivate = imesa;
|
||||
|
||||
|
||||
imesa->i830Screen = screen;
|
||||
imesa->driScreen = sPriv;
|
||||
imesa->sarea = saPriv;
|
||||
imesa->glBuffer = NULL;
|
||||
|
||||
driParseConfigFiles (&imesa->optionCache, &screen->optionCache,
|
||||
screen->driScrnPriv->myNum, "i830");
|
||||
|
||||
(void) memset( imesa->texture_heaps, 0, sizeof( imesa->texture_heaps ) );
|
||||
make_empty_list( & imesa->swapped );
|
||||
|
||||
imesa->nr_heaps = 1;
|
||||
imesa->texture_heaps[0] = driCreateTextureHeap( 0, imesa,
|
||||
screen->textureSize,
|
||||
12,
|
||||
I830_NR_TEX_REGIONS,
|
||||
imesa->sarea->texList,
|
||||
(unsigned *) & imesa->sarea->texAge, /* XXX shouldn't need cast! */
|
||||
& imesa->swapped,
|
||||
sizeof( struct i830_texture_object_t ),
|
||||
(destroy_texture_object_t *) i830DestroyTexObj );
|
||||
|
||||
/* Set the maximum texture size small enough that we can guarantee
|
||||
* that every texture unit can bind a maximal texture and have them
|
||||
* in memory at once.
|
||||
*/
|
||||
|
||||
ctx = imesa->glCtx;
|
||||
ctx->Const.MaxTextureUnits = driQueryOptioni(&imesa->optionCache,
|
||||
"texture_units");
|
||||
ctx->Const.MaxTextureImageUnits = ctx->Const.MaxTextureUnits;
|
||||
ctx->Const.MaxTextureCoordUnits = ctx->Const.MaxTextureUnits;
|
||||
|
||||
/* FIXME: driCalculateMaxTextureLevels assumes that mipmaps are tightly
|
||||
* FIXME: packed, but they're not in Intel graphics hardware.
|
||||
*/
|
||||
driCalculateMaxTextureLevels( imesa->texture_heaps,
|
||||
imesa->nr_heaps,
|
||||
& ctx->Const,
|
||||
4,
|
||||
11, /* max 2D texture size is 2048x2048 */
|
||||
0, /* 3D textures unsupported */
|
||||
0, /* cube textures unsupported. */
|
||||
0, /* texture rectangles unsupported. */
|
||||
12,
|
||||
GL_FALSE );
|
||||
|
||||
ctx->Const.MaxTextureMaxAnisotropy = 2.0;
|
||||
|
||||
ctx->Const.MinLineWidth = 1.0;
|
||||
ctx->Const.MinLineWidthAA = 1.0;
|
||||
ctx->Const.MaxLineWidth = 3.0;
|
||||
ctx->Const.MaxLineWidthAA = 3.0;
|
||||
ctx->Const.LineWidthGranularity = 1.0;
|
||||
|
||||
ctx->Const.MinPointSize = 1.0;
|
||||
ctx->Const.MinPointSizeAA = 1.0;
|
||||
ctx->Const.MaxPointSize = 255.0;
|
||||
ctx->Const.MaxPointSizeAA = 3.0;
|
||||
ctx->Const.PointSizeGranularity = 1.0;
|
||||
|
||||
ctx->Driver.GetBufferSize = i830BufferSize;
|
||||
ctx->Driver.ResizeBuffers = _mesa_resize_framebuffer;
|
||||
ctx->Driver.GetString = i830DDGetString;
|
||||
|
||||
/* Who owns who? */
|
||||
ctx->DriverCtx = (void *) imesa;
|
||||
imesa->glCtx = ctx;
|
||||
|
||||
/* Initialize the software rasterizer and helper modules. */
|
||||
_swrast_CreateContext( ctx );
|
||||
_ac_CreateContext( ctx );
|
||||
_tnl_CreateContext( ctx );
|
||||
_swsetup_CreateContext( ctx );
|
||||
|
||||
/* Install the customized pipeline: */
|
||||
_tnl_destroy_pipeline( ctx );
|
||||
_tnl_install_pipeline( ctx, i830_pipeline );
|
||||
|
||||
/* Configure swrast and T&L to match hardware characteristics: */
|
||||
_swrast_allow_pixel_fog( ctx, GL_FALSE );
|
||||
_swrast_allow_vertex_fog( ctx, GL_TRUE );
|
||||
_tnl_allow_pixel_fog( ctx, GL_FALSE );
|
||||
_tnl_allow_vertex_fog( ctx, GL_TRUE );
|
||||
|
||||
/* Dri stuff */
|
||||
imesa->hHWContext = driContextPriv->hHWContext;
|
||||
imesa->driFd = sPriv->fd;
|
||||
/* drmLock ptr = &drm_hw_lock_t */
|
||||
imesa->driHwLock = (drmLock *) &sPriv->pSAREA->lock;
|
||||
imesa->hw_stencil = mesaVis->stencilBits && mesaVis->depthBits == 24;
|
||||
|
||||
switch(mesaVis->depthBits) {
|
||||
case 16:
|
||||
imesa->depth_scale = 1.0/0xffff;
|
||||
imesa->depth_clear_mask = ~0;
|
||||
imesa->ClearDepth = 0xffff;
|
||||
break;
|
||||
case 24:
|
||||
imesa->depth_scale = 1.0/0xffffff;
|
||||
imesa->depth_clear_mask = 0x00ffffff;
|
||||
imesa->stencil_clear_mask = 0xff000000;
|
||||
imesa->ClearDepth = 0x00ffffff;
|
||||
break;
|
||||
case 32: /* Not supported */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* Completely disable stenciling for now, there are some serious issues
|
||||
* with stencil.
|
||||
*/
|
||||
#if 0
|
||||
imesa->hw_stencil = 0;
|
||||
#endif
|
||||
|
||||
imesa->RenderIndex = ~0;
|
||||
imesa->dirty = ~0;
|
||||
imesa->upload_cliprects = GL_TRUE;
|
||||
|
||||
imesa->CurrentTexObj[0] = 0;
|
||||
imesa->CurrentTexObj[1] = 0;
|
||||
|
||||
imesa->do_irqs = (imesa->i830Screen->irq_active &&
|
||||
!getenv("I830_NO_IRQS"));
|
||||
|
||||
_math_matrix_ctr (&imesa->ViewportMatrix);
|
||||
|
||||
driInitExtensions( ctx, card_extensions, GL_TRUE );
|
||||
|
||||
if (imesa->glCtx->Mesa_DXTn) {
|
||||
_mesa_enable_extension( ctx, "GL_EXT_texture_compression_s3tc" );
|
||||
_mesa_enable_extension( ctx, "GL_S3_s3tc" );
|
||||
}
|
||||
else if (driQueryOptionb (&imesa->optionCache, "force_s3tc_enable")) {
|
||||
_mesa_enable_extension( ctx, "GL_EXT_texture_compression_s3tc" );
|
||||
}
|
||||
|
||||
_mesa_enable_extension( ctx, "GL_3DFX_texture_compression_FXT1" );
|
||||
|
||||
/* XXX these should really go right after _mesa_init_driver_functions() */
|
||||
i830DDInitStateFuncs( ctx );
|
||||
i830InitTriFuncs (ctx);
|
||||
i830DDInitSpanFuncs( ctx );
|
||||
i830DDInitState (ctx);
|
||||
|
||||
#if DO_DEBUG
|
||||
I830_DEBUG = driParseDebugString( getenv( "I830_DEBUG" ),
|
||||
debug_control );
|
||||
I830_DEBUG |= driParseDebugString( getenv( "INTEL_DEBUG" ),
|
||||
debug_control );
|
||||
#endif
|
||||
|
||||
if (getenv("I830_NO_RAST") ||
|
||||
getenv("INTEL_NO_RAST")) {
|
||||
fprintf(stderr, "disabling 3D rasterization\n");
|
||||
FALLBACK(imesa, I830_FALLBACK_USER, 1);
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
void i830DestroyContext(__DRIcontextPrivate *driContextPriv)
|
||||
{
|
||||
i830ContextPtr imesa = (i830ContextPtr) driContextPriv->driverPrivate;
|
||||
|
||||
assert(imesa); /* should never be null */
|
||||
if (imesa) {
|
||||
GLboolean release_texture_heaps;
|
||||
|
||||
|
||||
release_texture_heaps = (imesa->glCtx->Shared->RefCount == 1);
|
||||
_swsetup_DestroyContext (imesa->glCtx);
|
||||
_tnl_DestroyContext (imesa->glCtx);
|
||||
_ac_DestroyContext (imesa->glCtx);
|
||||
_swrast_DestroyContext (imesa->glCtx);
|
||||
|
||||
/* free the Mesa context */
|
||||
imesa->glCtx->DriverCtx = NULL;
|
||||
_mesa_destroy_context(imesa->glCtx);
|
||||
|
||||
if ( release_texture_heaps ) {
|
||||
/* This share group is about to go away, free our private
|
||||
* texture object data.
|
||||
*/
|
||||
int i;
|
||||
|
||||
for ( i = 0 ; i < imesa->nr_heaps ; i++ ) {
|
||||
driDestroyTextureHeap( imesa->texture_heaps[ i ] );
|
||||
imesa->texture_heaps[ i ] = NULL;
|
||||
}
|
||||
|
||||
assert( is_empty_list( & imesa->swapped ) );
|
||||
}
|
||||
|
||||
FREE(imesa);
|
||||
}
|
||||
}
|
||||
|
||||
void i830XMesaSetFrontClipRects( i830ContextPtr imesa )
|
||||
{
|
||||
__DRIdrawablePrivate *dPriv = imesa->driDrawable;
|
||||
|
||||
imesa->numClipRects = dPriv->numClipRects;
|
||||
imesa->pClipRects = dPriv->pClipRects;
|
||||
imesa->drawX = dPriv->x;
|
||||
imesa->drawY = dPriv->y;
|
||||
|
||||
i830EmitDrawingRectangle( imesa );
|
||||
imesa->upload_cliprects = GL_TRUE;
|
||||
}
|
||||
|
||||
void i830XMesaSetBackClipRects( i830ContextPtr imesa )
|
||||
{
|
||||
__DRIdrawablePrivate *dPriv = imesa->driDrawable;
|
||||
|
||||
if (imesa->sarea->pf_enabled == 0 && dPriv->numBackClipRects == 0) {
|
||||
imesa->numClipRects = dPriv->numClipRects;
|
||||
imesa->pClipRects = dPriv->pClipRects;
|
||||
imesa->drawX = dPriv->x;
|
||||
imesa->drawY = dPriv->y;
|
||||
} else {
|
||||
imesa->numClipRects = dPriv->numBackClipRects;
|
||||
imesa->pClipRects = dPriv->pBackClipRects;
|
||||
imesa->drawX = dPriv->backX;
|
||||
imesa->drawY = dPriv->backY;
|
||||
}
|
||||
|
||||
i830EmitDrawingRectangle( imesa );
|
||||
imesa->upload_cliprects = GL_TRUE;
|
||||
}
|
||||
|
||||
static void i830XMesaWindowMoved( i830ContextPtr imesa )
|
||||
{
|
||||
switch (imesa->glCtx->DrawBuffer->_ColorDrawBufferMask[0]) {
|
||||
case BUFFER_BIT_FRONT_LEFT:
|
||||
i830XMesaSetFrontClipRects( imesa );
|
||||
break;
|
||||
case BUFFER_BIT_BACK_LEFT:
|
||||
i830XMesaSetBackClipRects( imesa );
|
||||
break;
|
||||
default:
|
||||
/* glDrawBuffer(GL_NONE or GL_FRONT_AND_BACK): software fallback */
|
||||
i830XMesaSetFrontClipRects( imesa );
|
||||
}
|
||||
}
|
||||
|
||||
GLboolean i830UnbindContext(__DRIcontextPrivate *driContextPriv)
|
||||
{
|
||||
i830ContextPtr imesa = (i830ContextPtr) driContextPriv->driverPrivate;
|
||||
unsigned i;
|
||||
|
||||
if (imesa) {
|
||||
/* Might want to change this so texblend isn't always updated */
|
||||
imesa->dirty |= (I830_UPLOAD_CTX |
|
||||
I830_UPLOAD_BUFFERS |
|
||||
I830_UPLOAD_STIPPLE |
|
||||
I830_UPLOAD_TEXBLEND0 |
|
||||
I830_UPLOAD_TEXBLEND1 |
|
||||
I830_UPLOAD_TEXBLEND2 |
|
||||
I830_UPLOAD_TEXBLEND3);
|
||||
|
||||
for ( i = 0 ; i < imesa->glCtx->Const.MaxTextureUnits ; i++ ) {
|
||||
if (imesa->CurrentTexObj[i]) imesa->dirty |= I830_UPLOAD_TEX_N( i );
|
||||
}
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
GLboolean i830MakeCurrent(__DRIcontextPrivate *driContextPriv,
|
||||
__DRIdrawablePrivate *driDrawPriv,
|
||||
__DRIdrawablePrivate *driReadPriv)
|
||||
{
|
||||
|
||||
if (driContextPriv) {
|
||||
i830ContextPtr imesa = (i830ContextPtr) driContextPriv->driverPrivate;
|
||||
|
||||
if ( imesa->driDrawable != driDrawPriv ) {
|
||||
imesa->driDrawable = driDrawPriv;
|
||||
i830XMesaWindowMoved( imesa );
|
||||
imesa->mesa_drawable = driDrawPriv;
|
||||
}
|
||||
|
||||
imesa->driReadable = driReadPriv;
|
||||
|
||||
_mesa_make_current(imesa->glCtx,
|
||||
(GLframebuffer *) driDrawPriv->driverPrivate,
|
||||
(GLframebuffer *) driReadPriv->driverPrivate);
|
||||
} else {
|
||||
_mesa_make_current(NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
void i830GetLock( i830ContextPtr imesa, GLuint flags )
|
||||
{
|
||||
__DRIdrawablePrivate *dPriv = imesa->driDrawable;
|
||||
__DRIscreenPrivate *sPriv = imesa->driScreen;
|
||||
I830SAREAPtr sarea = imesa->sarea;
|
||||
int me = imesa->hHWContext;
|
||||
unsigned i;
|
||||
|
||||
drmGetLock(imesa->driFd, imesa->hHWContext, flags);
|
||||
|
||||
/* If the window moved, may need to set a new cliprect now.
|
||||
*
|
||||
* NOTE: This releases and regains the hw lock, so all state
|
||||
* checking must be done *after* this call:
|
||||
*/
|
||||
DRI_VALIDATE_DRAWABLE_INFO( sPriv, dPriv);
|
||||
|
||||
/* If we lost context, need to dump all registers to hardware.
|
||||
* Note that we don't care about 2d contexts, even if they perform
|
||||
* accelerated commands, so the DRI locking in the X server is even
|
||||
* more broken than usual.
|
||||
*/
|
||||
|
||||
if (sarea->ctxOwner != me) {
|
||||
driUpdateFramebufferSize(imesa->glCtx, dPriv);
|
||||
imesa->upload_cliprects = GL_TRUE;
|
||||
imesa->dirty |= (I830_UPLOAD_CTX |
|
||||
I830_UPLOAD_BUFFERS |
|
||||
I830_UPLOAD_STIPPLE);
|
||||
|
||||
for ( i = 0 ; i < imesa->glCtx->Const.MaxTextureUnits ; i++ ) {
|
||||
if(imesa->CurrentTexObj[i]) imesa->dirty |= I830_UPLOAD_TEX_N( i );
|
||||
if(imesa->TexBlendWordsUsed[i]) imesa->dirty |= I830_UPLOAD_TEXBLEND_N( i );
|
||||
}
|
||||
|
||||
sarea->perf_boxes = imesa->perf_boxes | I830_BOX_LOST_CONTEXT;
|
||||
sarea->ctxOwner = me;
|
||||
}
|
||||
|
||||
/* Shared texture managment - if another client has played with
|
||||
* texture space, figure out which if any of our textures have been
|
||||
* ejected, and update our global LRU.
|
||||
*/
|
||||
|
||||
for ( i = 0 ; i < imesa->nr_heaps ; i++ ) {
|
||||
DRI_AGE_TEXTURES( imesa->texture_heaps[ i ] );
|
||||
}
|
||||
|
||||
if (imesa->lastStamp != dPriv->lastStamp) {
|
||||
i830XMesaWindowMoved( imesa );
|
||||
imesa->lastStamp = dPriv->lastStamp;
|
||||
}
|
||||
|
||||
sarea->last_quiescent = -1; /* just kill it for now */
|
||||
}
|
||||
|
||||
void i830SwapBuffers( __DRIdrawablePrivate *dPriv )
|
||||
{
|
||||
if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
|
||||
i830ContextPtr imesa;
|
||||
GLcontext *ctx;
|
||||
imesa = (i830ContextPtr) dPriv->driContextPriv->driverPrivate;
|
||||
ctx = imesa->glCtx;
|
||||
if (ctx->Visual.doubleBufferMode) {
|
||||
_mesa_notifySwapBuffers( ctx ); /* flush pending rendering comands */
|
||||
if ( 0 /*imesa->doPageFlip*/ ) { /* doPageFlip is never set !!! */
|
||||
i830PageFlip( dPriv );
|
||||
} else {
|
||||
i830CopyBuffer( dPriv );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* XXX this shouldn't be an error but we can't handle it for now */
|
||||
_mesa_problem(NULL, "%s: drawable has no context!\n", __FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,327 +0,0 @@
|
|||
/*
|
||||
* GLX Hardware Device Driver for Intel i830
|
||||
* Copyright (C) 1999 Keith Whitwell
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Adapted for use in the I830M driver:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*/
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_context.h,v 1.7 2003/02/06 04:18:01 dawes Exp $ */
|
||||
|
||||
#ifndef I830CONTEXT_INC
|
||||
#define I830CONTEXT_INC
|
||||
|
||||
typedef struct i830_context_t i830Context;
|
||||
typedef struct i830_context_t *i830ContextPtr;
|
||||
typedef struct i830_texture_object_t *i830TextureObjectPtr;
|
||||
|
||||
|
||||
#include "mtypes.h"
|
||||
#include "drm.h"
|
||||
#include "mm.h"
|
||||
#include "tnl/t_vertex.h"
|
||||
|
||||
#include "i830_screen.h"
|
||||
#include "i830_tex.h"
|
||||
|
||||
#define TAG(x) i830##x
|
||||
#include "tnl_dd/t_dd_vertex.h"
|
||||
#undef TAG
|
||||
|
||||
#define DV_PF_555 (1<<8)
|
||||
#define DV_PF_565 (2<<8)
|
||||
#define DV_PF_8888 (3<<8)
|
||||
|
||||
#define I830_TEX_MAXLEVELS 10
|
||||
|
||||
#define I830_CONTEXT(ctx) ((i830ContextPtr)(ctx->DriverCtx))
|
||||
#define GET_DISPATCH_AGE(imesa) imesa->sarea->last_dispatch
|
||||
#define GET_ENQUEUE_AGE(imesa) imesa->sarea->last_enqueue
|
||||
|
||||
|
||||
typedef void (*i830_tri_func)(i830ContextPtr, i830Vertex *, i830Vertex *,
|
||||
i830Vertex *);
|
||||
typedef void (*i830_line_func)(i830ContextPtr, i830Vertex *, i830Vertex *);
|
||||
typedef void (*i830_point_func)(i830ContextPtr, i830Vertex *);
|
||||
|
||||
#define I830_MAX_TEXTURE_UNITS 4
|
||||
|
||||
#define I830_FALLBACK_TEXTURE 0x1
|
||||
#define I830_FALLBACK_DRAW_BUFFER 0x2
|
||||
#define I830_FALLBACK_READ_BUFFER 0x4
|
||||
#define I830_FALLBACK_COLORMASK 0x8
|
||||
#define I830_FALLBACK_RENDERMODE 0x10
|
||||
#define I830_FALLBACK_STENCIL 0x20
|
||||
#define I830_FALLBACK_STIPPLE 0x40
|
||||
#define I830_FALLBACK_USER 0x80
|
||||
|
||||
struct i830_context_t
|
||||
{
|
||||
GLint refcount;
|
||||
GLcontext *glCtx;
|
||||
|
||||
/*From I830 stuff*/
|
||||
int TextureMode;
|
||||
GLuint renderindex;
|
||||
GLuint TexBlendWordsUsed[I830_MAX_TEXTURE_UNITS];
|
||||
GLuint TexBlend[I830_MAX_TEXTURE_UNITS][I830_TEXBLEND_SIZE];
|
||||
GLuint Init_TexBlend[I830_MAX_TEXTURE_UNITS][I830_TEXBLEND_SIZE];
|
||||
GLuint Init_TexBlendWordsUsed[I830_MAX_TEXTURE_UNITS];
|
||||
GLuint Init_BufferSetup[I830_DEST_SETUP_SIZE];
|
||||
GLuint LodBias[I830_MAX_TEXTURE_UNITS];
|
||||
|
||||
GLenum palette_format;
|
||||
GLuint palette[256];
|
||||
|
||||
|
||||
GLuint Init_Setup[I830_CTX_SETUP_SIZE];
|
||||
GLuint vertex_prim;
|
||||
drmBufPtr vertex_dma_buffer;
|
||||
|
||||
GLboolean mask_red;
|
||||
GLboolean mask_green;
|
||||
GLboolean mask_blue;
|
||||
GLboolean mask_alpha;
|
||||
|
||||
GLubyte clear_red;
|
||||
GLubyte clear_green;
|
||||
GLubyte clear_blue;
|
||||
GLubyte clear_alpha;
|
||||
|
||||
GLfloat depth_scale;
|
||||
int depth_clear_mask;
|
||||
int stencil_clear_mask;
|
||||
int ClearDepth;
|
||||
int hw_stencil;
|
||||
|
||||
GLuint MonoColor;
|
||||
|
||||
GLuint LastTexEnabled;
|
||||
GLuint TexEnabledMask;
|
||||
|
||||
/* Texture object bookkeeping
|
||||
*/
|
||||
unsigned nr_heaps;
|
||||
driTexHeap * texture_heaps[1];
|
||||
driTextureObject swapped;
|
||||
|
||||
struct i830_texture_object_t *CurrentTexObj[I830_MAX_TEXTURE_UNITS];
|
||||
|
||||
/* Rasterization and vertex state:
|
||||
*/
|
||||
GLuint Fallback;
|
||||
GLuint NewGLState;
|
||||
|
||||
/* Vertex state
|
||||
*/
|
||||
GLuint vertex_size;
|
||||
struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
|
||||
GLuint vertex_attr_count;
|
||||
char *verts; /* points to tnl->clipspace.vertex_buf */
|
||||
|
||||
|
||||
/* State for i830tris.c.
|
||||
*/
|
||||
GLuint RenderIndex;
|
||||
GLmatrix ViewportMatrix;
|
||||
GLenum render_primitive;
|
||||
GLenum reduced_primitive;
|
||||
GLuint hw_primitive;
|
||||
|
||||
drmBufPtr vertex_buffer;
|
||||
char *vertex_addr;
|
||||
GLuint vertex_low;
|
||||
GLuint vertex_high;
|
||||
GLuint vertex_last_prim;
|
||||
|
||||
GLboolean upload_cliprects;
|
||||
|
||||
|
||||
/* Fallback rasterization functions
|
||||
*/
|
||||
i830_point_func draw_point;
|
||||
i830_line_func draw_line;
|
||||
i830_tri_func draw_tri;
|
||||
|
||||
/* Hardware state
|
||||
*/
|
||||
GLuint dirty; /* I810_UPLOAD_* */
|
||||
GLuint Setup[I830_CTX_SETUP_SIZE];
|
||||
GLuint BufferSetup[I830_DEST_SETUP_SIZE];
|
||||
GLuint StippleSetup[I830_STP_SETUP_SIZE];
|
||||
unsigned int lastStamp;
|
||||
GLboolean hw_stipple;
|
||||
|
||||
GLenum TexEnvImageFmt[2];
|
||||
|
||||
/* State which can't be computed completely on the fly:
|
||||
*/
|
||||
GLuint LcsCullMode;
|
||||
GLuint LcsLineWidth;
|
||||
GLuint LcsPointSize;
|
||||
|
||||
/* Funny mesa mirrors
|
||||
*/
|
||||
GLuint ClearColor;
|
||||
|
||||
/* DRI stuff
|
||||
*/
|
||||
GLuint needClip;
|
||||
GLframebuffer *glBuffer;
|
||||
|
||||
/* These refer to the current draw (front vs. back) buffer:
|
||||
*/
|
||||
char *drawMap; /* draw buffer address in virtual mem */
|
||||
char *readMap;
|
||||
int drawX; /* origin of drawable in draw buffer */
|
||||
int drawY;
|
||||
GLuint numClipRects; /* cliprects for that buffer */
|
||||
drm_clip_rect_t *pClipRects;
|
||||
|
||||
int lastSwap;
|
||||
int texAge;
|
||||
int ctxAge;
|
||||
int dirtyAge;
|
||||
int perf_boxes;
|
||||
|
||||
int do_irqs;
|
||||
|
||||
GLboolean scissor;
|
||||
drm_clip_rect_t draw_rect;
|
||||
drm_clip_rect_t scissor_rect;
|
||||
|
||||
drm_context_t hHWContext;
|
||||
drmLock *driHwLock;
|
||||
int driFd;
|
||||
|
||||
__DRIdrawablePrivate *driDrawable; /**< DRI drawable bound to this
|
||||
* context for drawing.
|
||||
*/
|
||||
__DRIdrawablePrivate *driReadable; /**< DRI drawable bound to this
|
||||
* context for reading.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Drawable used by Mesa for software fallbacks for reading and
|
||||
* writing. It is set by Mesa's \c SetBuffer callback, and will always be
|
||||
* either \c i830_context_t::driDrawable or \c i830_context_t::driReadable.
|
||||
*/
|
||||
|
||||
__DRIdrawablePrivate * mesa_drawable;
|
||||
|
||||
__DRIscreenPrivate *driScreen;
|
||||
i830ScreenPrivate *i830Screen;
|
||||
I830SAREAPtr sarea;
|
||||
|
||||
/**
|
||||
* Configuration cache
|
||||
*/
|
||||
driOptionCache optionCache;
|
||||
};
|
||||
|
||||
|
||||
#define I830_TEX_UNIT_ENABLED(unit) (1<<unit)
|
||||
#define VALID_I830_TEXTURE_OBJECT(tobj) (tobj)
|
||||
|
||||
#define I830_CONTEXT(ctx) ((i830ContextPtr)(ctx->DriverCtx))
|
||||
#define I830_DRIVER_DATA(vb) ((i830VertexBufferPtr)((vb)->driver_data))
|
||||
#define GET_DISPATCH_AGE(imesa) imesa->sarea->last_dispatch
|
||||
#define GET_ENQUEUE_AGE(imesa) imesa->sarea->last_enqueue
|
||||
|
||||
|
||||
/* Lock the hardware and validate our state.
|
||||
*/
|
||||
#define LOCK_HARDWARE( imesa ) \
|
||||
do { \
|
||||
char __ret=0; \
|
||||
DRM_CAS(imesa->driHwLock, imesa->hHWContext, \
|
||||
(DRM_LOCK_HELD|imesa->hHWContext), __ret); \
|
||||
if (__ret) \
|
||||
i830GetLock( imesa, 0 ); \
|
||||
}while (0)
|
||||
|
||||
|
||||
/* Unlock the hardware using the global current context
|
||||
*/
|
||||
#define UNLOCK_HARDWARE(imesa) \
|
||||
do { \
|
||||
imesa->perf_boxes |= imesa->sarea->perf_boxes; \
|
||||
DRM_UNLOCK(imesa->driFd, imesa->driHwLock, imesa->hHWContext); \
|
||||
} while (0)
|
||||
|
||||
/* This is the wrong way to do it, I'm sure. Otherwise the drm
|
||||
* bitches that I've already got the heavyweight lock. At worst,
|
||||
* this is 3 ioctls. The best solution probably only gets me down
|
||||
* to 2 ioctls in the worst case.
|
||||
*/
|
||||
#define LOCK_HARDWARE_QUIESCENT( imesa ) do { \
|
||||
LOCK_HARDWARE( imesa ); \
|
||||
i830RegetLockQuiescent( imesa ); \
|
||||
} while(0)
|
||||
|
||||
|
||||
|
||||
extern void i830GetLock(i830ContextPtr imesa, GLuint flags);
|
||||
extern void i830EmitHwStateLocked(i830ContextPtr imesa);
|
||||
extern void i830EmitDrawingRectangle(i830ContextPtr imesa);
|
||||
extern void i830XMesaSetBackClipRects(i830ContextPtr imesa);
|
||||
extern void i830XMesaSetFrontClipRects(i830ContextPtr imesa);
|
||||
extern void i830DDExtensionsInit(GLcontext *ctx);
|
||||
extern void i830DDInitDriverFuncs(GLcontext *ctx);
|
||||
extern void i830DDUpdateHwState(GLcontext *ctx);
|
||||
|
||||
#define SUBPIXEL_X 0.125
|
||||
#define SUBPIXEL_Y 0.125
|
||||
|
||||
|
||||
/* ================================================================
|
||||
* Debugging:
|
||||
*/
|
||||
#define DO_DEBUG 1
|
||||
#if DO_DEBUG
|
||||
extern int I830_DEBUG;
|
||||
#else
|
||||
#define I830_DEBUG 0
|
||||
#endif
|
||||
|
||||
#define DEBUG_TEXTURE 0x1
|
||||
#define DEBUG_STATE 0x2
|
||||
#define DEBUG_IOCTL 0x4
|
||||
#define DEBUG_PRIMS 0x8
|
||||
#define DEBUG_VERTS 0x10
|
||||
#define DEBUG_FALLBACKS 0x20
|
||||
#define DEBUG_VERBOSE 0x40
|
||||
#define DEBUG_DRI 0x80
|
||||
#define DEBUG_DMA 0x100
|
||||
#define DEBUG_SANITY 0x200
|
||||
#define DEBUG_SYNC 0x400
|
||||
#define DEBUG_SLEEP 0x800
|
||||
|
||||
|
||||
#define PCI_CHIP_845_G 0x2562
|
||||
#define PCI_CHIP_I830_M 0x3577
|
||||
#define PCI_CHIP_I855_GM 0x3582
|
||||
#define PCI_CHIP_I865_G 0x2572
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -1,415 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 2001 2d3d Inc., Delray Beach, FL
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_debug.c,v 1.3 2002/12/10 01:26:53 dawes Exp $ */
|
||||
|
||||
/*
|
||||
* Author:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*/
|
||||
|
||||
#include "glheader.h"
|
||||
#include "context.h"
|
||||
#include "macros.h"
|
||||
#include "enums.h"
|
||||
#include "dd.h"
|
||||
|
||||
#include "mm.h"
|
||||
|
||||
#include "i830_screen.h"
|
||||
#include "i830_dri.h"
|
||||
|
||||
#include "i830_context.h"
|
||||
#include "i830_state.h"
|
||||
#include "i830_tex.h"
|
||||
#include "i830_tris.h"
|
||||
#include "i830_ioctl.h"
|
||||
#include "i830_debug.h"
|
||||
|
||||
#include "swrast/swrast.h"
|
||||
#include "array_cache/acache.h"
|
||||
#include "tnl/tnl.h"
|
||||
#include "swrast_setup/swrast_setup.h"
|
||||
|
||||
#include "tnl/t_pipeline.h"
|
||||
|
||||
|
||||
#define TINY_VERTEX_FORMAT (STATE3D_VERTEX_FORMAT_CMD | \
|
||||
VRTX_TEX_COORD_COUNT(0) | \
|
||||
VRTX_HAS_DIFFUSE | \
|
||||
VRTX_HAS_XYZ)
|
||||
|
||||
#define NOTEX_VERTEX_FORMAT (STATE3D_VERTEX_FORMAT_CMD | \
|
||||
VRTX_TEX_COORD_COUNT(0) | \
|
||||
VRTX_HAS_DIFFUSE | \
|
||||
VRTX_HAS_SPEC | \
|
||||
VRTX_HAS_XYZW)
|
||||
|
||||
#define TEX0_VERTEX_FORMAT (STATE3D_VERTEX_FORMAT_CMD | \
|
||||
VRTX_TEX_COORD_COUNT(1) | \
|
||||
VRTX_HAS_DIFFUSE | \
|
||||
VRTX_HAS_SPEC | \
|
||||
VRTX_HAS_XYZW)
|
||||
|
||||
#define TEX1_VERTEX_FORMAT (STATE3D_VERTEX_FORMAT_CMD | \
|
||||
VRTX_TEX_COORD_COUNT(2) | \
|
||||
VRTX_HAS_DIFFUSE | \
|
||||
VRTX_HAS_SPEC | \
|
||||
VRTX_HAS_XYZW)
|
||||
|
||||
#define PROJ_VF2 (STATE3D_VERTEX_FORMAT_2_CMD | \
|
||||
VRTX_TEX_SET_0_FMT(TEXCOORDFMT_3D) | \
|
||||
VRTX_TEX_SET_1_FMT(TEXCOORDFMT_3D) | \
|
||||
VRTX_TEX_SET_2_FMT(TEXCOORDFMT_3D) | \
|
||||
VRTX_TEX_SET_3_FMT(TEXCOORDFMT_3D))
|
||||
|
||||
#define NON_PROJ_VF2 (STATE3D_VERTEX_FORMAT_2_CMD | \
|
||||
VRTX_TEX_SET_0_FMT(TEXCOORDFMT_2D) | \
|
||||
VRTX_TEX_SET_1_FMT(TEXCOORDFMT_2D) | \
|
||||
VRTX_TEX_SET_2_FMT(TEXCOORDFMT_2D) | \
|
||||
VRTX_TEX_SET_3_FMT(TEXCOORDFMT_2D))
|
||||
|
||||
void i830DumpContextState( i830ContextPtr imesa )
|
||||
{
|
||||
GLuint *Context = imesa->Setup;
|
||||
|
||||
fprintf(stderr, "%s\n", __FUNCTION__);
|
||||
fprintf(stderr, "STATE1 : 0x%08x\n", Context[I830_CTXREG_STATE1]);
|
||||
fprintf(stderr, "STATE2 : 0x%08x\n", Context[I830_CTXREG_STATE2]);
|
||||
fprintf(stderr, "STATE3 : 0x%08x\n", Context[I830_CTXREG_STATE3]);
|
||||
fprintf(stderr, "STATE4 : 0x%08x\n", Context[I830_CTXREG_STATE4]);
|
||||
fprintf(stderr, "STATE5 : 0x%08x\n", Context[I830_CTXREG_STATE5]);
|
||||
fprintf(stderr, "IALPHAB : 0x%08x\n", Context[I830_CTXREG_IALPHAB]);
|
||||
fprintf(stderr, "STENCILTST : 0x%08x\n", Context[I830_CTXREG_STENCILTST]);
|
||||
fprintf(stderr, "ENABLES_1 : 0x%08x\n", Context[I830_CTXREG_ENABLES_1]);
|
||||
fprintf(stderr, "ENABLES_2 : 0x%08x\n", Context[I830_CTXREG_ENABLES_2]);
|
||||
fprintf(stderr, "AA : 0x%08x\n", Context[I830_CTXREG_AA]);
|
||||
fprintf(stderr, "FOGCOLOR : 0x%08x\n", Context[I830_CTXREG_FOGCOLOR]);
|
||||
fprintf(stderr, "BCOLOR0 : 0x%08x\n", Context[I830_CTXREG_BLENDCOLR0]);
|
||||
fprintf(stderr, "BCOLOR : 0x%08x\n", Context[I830_CTXREG_BLENDCOLR]);
|
||||
fprintf(stderr, "VF : 0x%08x\n", Context[I830_CTXREG_VF]);
|
||||
fprintf(stderr, "VF2 : 0x%08x\n", Context[I830_CTXREG_VF2]);
|
||||
fprintf(stderr, "MCSB0 : 0x%08x\n", Context[I830_CTXREG_MCSB0]);
|
||||
fprintf(stderr, "MCSB1 : 0x%08x\n", Context[I830_CTXREG_MCSB1]);
|
||||
}
|
||||
|
||||
void i830DumpBufferState( i830ContextPtr imesa )
|
||||
{
|
||||
GLuint *Buffer = imesa->BufferSetup;
|
||||
|
||||
fprintf(stderr, "%s\n", __FUNCTION__);
|
||||
fprintf(stderr, "CBUFADDR : 0x%08x\n", Buffer[I830_DESTREG_CBUFADDR]);
|
||||
fprintf(stderr, "DBUFADDR : 0x%08x\n", Buffer[I830_DESTREG_DBUFADDR]);
|
||||
fprintf(stderr, "DV0 : 0x%08x\n", Buffer[I830_DESTREG_DV0]);
|
||||
fprintf(stderr, "DV1 : 0x%08x\n", Buffer[I830_DESTREG_DV1]);
|
||||
fprintf(stderr, "SENABLE : 0x%08x\n", Buffer[I830_DESTREG_SENABLE]);
|
||||
fprintf(stderr, "SR0 : 0x%08x\n", Buffer[I830_DESTREG_SR0]);
|
||||
fprintf(stderr, "SR1 : 0x%08x\n", Buffer[I830_DESTREG_SR1]);
|
||||
fprintf(stderr, "SR2 : 0x%08x\n", Buffer[I830_DESTREG_SR2]);
|
||||
fprintf(stderr, "DR0 : 0x%08x\n", Buffer[I830_DESTREG_DR0]);
|
||||
fprintf(stderr, "DR1 : 0x%08x\n", Buffer[I830_DESTREG_DR1]);
|
||||
fprintf(stderr, "DR2 : 0x%08x\n", Buffer[I830_DESTREG_DR2]);
|
||||
fprintf(stderr, "DR3 : 0x%08x\n", Buffer[I830_DESTREG_DR3]);
|
||||
fprintf(stderr, "DR4 : 0x%08x\n", Buffer[I830_DESTREG_DR4]);
|
||||
}
|
||||
|
||||
void i830DumpStippleState( i830ContextPtr imesa )
|
||||
{
|
||||
GLuint *Buffer = imesa->BufferSetup;
|
||||
|
||||
fprintf(stderr, "%s\n", __FUNCTION__);
|
||||
fprintf(stderr, "ST1 : 0x%08x\n", Buffer[I830_STPREG_ST1]);
|
||||
}
|
||||
|
||||
void i830DumpTextureState( i830ContextPtr imesa, int unit )
|
||||
{
|
||||
i830TextureObjectPtr t = imesa->CurrentTexObj[unit];
|
||||
|
||||
if(t) {
|
||||
fprintf(stderr, "%s : unit %d\n", __FUNCTION__, unit);
|
||||
fprintf(stderr, "TM0LI : 0x%08x\n", t->Setup[I830_TEXREG_TM0LI]);
|
||||
fprintf(stderr, "TM0S0 : 0x%08x\n", t->Setup[I830_TEXREG_TM0S0]);
|
||||
fprintf(stderr, "TM0S1 : 0x%08x\n", t->Setup[I830_TEXREG_TM0S1]);
|
||||
fprintf(stderr, "TM0S2 : 0x%08x\n", t->Setup[I830_TEXREG_TM0S2]);
|
||||
fprintf(stderr, "TM0S3 : 0x%08x\n", t->Setup[I830_TEXREG_TM0S3]);
|
||||
fprintf(stderr, "TM0S4 : 0x%08x\n", t->Setup[I830_TEXREG_TM0S4]);
|
||||
fprintf(stderr, "NOP0 : 0x%08x\n", t->Setup[I830_TEXREG_NOP0]);
|
||||
fprintf(stderr, "NOP1 : 0x%08x\n", t->Setup[I830_TEXREG_NOP1]);
|
||||
fprintf(stderr, "NOP2 : 0x%08x\n", t->Setup[I830_TEXREG_NOP2]);
|
||||
fprintf(stderr, "MCS : 0x%08x\n", t->Setup[I830_TEXREG_MCS]);
|
||||
}
|
||||
}
|
||||
|
||||
void i830DumpTextureBlendState( i830ContextPtr imesa, int unit )
|
||||
{
|
||||
GLuint *TexBlend = imesa->TexBlend[unit];
|
||||
GLuint length = imesa->TexBlendWordsUsed[unit];
|
||||
int i;
|
||||
|
||||
fprintf(stderr, "%s : unit %d : length %d\n", __FUNCTION__, unit, length);
|
||||
for(i = 0; i < length; i++) {
|
||||
fprintf(stderr, "[%d] : 0x%08x\n", i, TexBlend[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void i830VertexSanity( i830ContextPtr imesa, drmI830Vertex vertex )
|
||||
{
|
||||
I830SAREAPtr sarea = imesa->sarea;
|
||||
char *prim_name;
|
||||
int size = 0;
|
||||
int vfmt_size = 0;
|
||||
int hw_nr_vertex = 0;
|
||||
int hw_start_vertex = 0;
|
||||
|
||||
/* Do a bunch of sanity checks on the vertices sent to the hardware */
|
||||
|
||||
size = vertex.used - 4;
|
||||
if(imesa->vertex_size && (size % imesa->vertex_size) != 0) {
|
||||
fprintf(stderr, "\n\nVertex size does not match imesa "
|
||||
"internal state\n");
|
||||
fprintf(stderr, "Buffer size : %d\n", size);
|
||||
fprintf(stderr, "Vertex size : %d\n", imesa->vertex_size);
|
||||
}
|
||||
|
||||
/* Check to see if the vertex format is good, and get its size */
|
||||
if (sarea->ContextState[I830_CTXREG_VF] == TINY_VERTEX_FORMAT) {
|
||||
vfmt_size = 16; /* 4 dwords */
|
||||
} else if (sarea->ContextState[I830_CTXREG_VF] ==
|
||||
NOTEX_VERTEX_FORMAT) {
|
||||
vfmt_size = 24; /* 6 dwords */
|
||||
} else if (sarea->ContextState[I830_CTXREG_VF] ==
|
||||
TEX0_VERTEX_FORMAT) {
|
||||
vfmt_size = 32; /* 8 dwords */
|
||||
if (sarea->ContextState[I830_CTXREG_VF2] != NON_PROJ_VF2) {
|
||||
fprintf(stderr, "\n\nTex 0 vertex format, but proj "
|
||||
"texturing\n");
|
||||
}
|
||||
} else if(sarea->ContextState[I830_CTXREG_VF] ==
|
||||
TEX1_VERTEX_FORMAT) {
|
||||
if (sarea->ContextState[I830_CTXREG_VF2] == NON_PROJ_VF2)
|
||||
vfmt_size = 40; /* 10 dwords */
|
||||
else
|
||||
vfmt_size = 48; /* 12 dwords */
|
||||
} else {
|
||||
fprintf(stderr, "\n\nUnknown vertex format : vf : %08x "
|
||||
"vf2 : %08x\n",
|
||||
sarea->ContextState[I830_CTXREG_VF],
|
||||
sarea->ContextState[I830_CTXREG_VF2]);
|
||||
}
|
||||
|
||||
if(vfmt_size && (size % vfmt_size) != 0) {
|
||||
fprintf(stderr, "\n\nVertex size does not match hardware "
|
||||
"internal state\n");
|
||||
fprintf(stderr, "Buffer size : %d\n", size);
|
||||
fprintf(stderr, "Vertex size : %d\n", vfmt_size);
|
||||
}
|
||||
|
||||
switch(sarea->vertex_prim) {
|
||||
case PRIM3D_POINTLIST:
|
||||
hw_start_vertex = 0;
|
||||
hw_nr_vertex = 1;
|
||||
prim_name = "PointList";
|
||||
break;
|
||||
|
||||
case PRIM3D_LINELIST:
|
||||
hw_start_vertex = 0;
|
||||
hw_nr_vertex = 2;
|
||||
prim_name = "LineList";
|
||||
break;
|
||||
|
||||
case PRIM3D_LINESTRIP:
|
||||
hw_start_vertex = 2;
|
||||
hw_nr_vertex = 1;
|
||||
prim_name = "LineStrip";
|
||||
break;
|
||||
|
||||
case PRIM3D_TRILIST:
|
||||
hw_start_vertex = 0;
|
||||
hw_nr_vertex = 3;
|
||||
prim_name = "TriList";
|
||||
break;
|
||||
|
||||
case PRIM3D_TRISTRIP:
|
||||
hw_start_vertex = 3;
|
||||
hw_nr_vertex = 1;
|
||||
prim_name = "TriStrip";
|
||||
break;
|
||||
|
||||
case PRIM3D_TRIFAN:
|
||||
hw_start_vertex = 3;
|
||||
hw_nr_vertex = 1;
|
||||
prim_name = "TriFan";
|
||||
break;
|
||||
|
||||
case PRIM3D_POLY:
|
||||
hw_start_vertex = 3;
|
||||
hw_nr_vertex = 1;
|
||||
prim_name = "Polygons";
|
||||
break;
|
||||
default:
|
||||
prim_name = "Unknown";
|
||||
fprintf(stderr, "\n\nUnknown primitive type : %08x\n",
|
||||
sarea->vertex_prim);
|
||||
}
|
||||
|
||||
if (hw_nr_vertex && vfmt_size) {
|
||||
int temp_size = size - (hw_start_vertex * vfmt_size);
|
||||
int remaining = (temp_size % (hw_nr_vertex * vfmt_size));
|
||||
|
||||
if (remaining != 0) {
|
||||
fprintf(stderr, "\n\nThis buffer contains an improper"
|
||||
" multiple of vertices for this primitive : %s\n",
|
||||
prim_name);
|
||||
fprintf(stderr, "Number of vertices in buffer : %d\n",
|
||||
size / vfmt_size);
|
||||
fprintf(stderr, "temp_size : %d\n", temp_size);
|
||||
fprintf(stderr, "remaining vertices : %d",
|
||||
remaining / vfmt_size);
|
||||
}
|
||||
}
|
||||
if (vfmt_size) {
|
||||
fprintf(stderr, "\n\nPrim name (%s), vertices (%d)\n",
|
||||
prim_name,
|
||||
size / vfmt_size);
|
||||
}
|
||||
}
|
||||
|
||||
void i830EmitHwStateLockedDebug( i830ContextPtr imesa )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ((imesa->dirty & I830_UPLOAD_TEX0_IMAGE) && imesa->CurrentTexObj[0]) {
|
||||
i830UploadTexImagesLocked(imesa, imesa->CurrentTexObj[0]);
|
||||
}
|
||||
|
||||
if ((imesa->dirty & I830_UPLOAD_TEX1_IMAGE) && imesa->CurrentTexObj[1]) {
|
||||
i830UploadTexImagesLocked(imesa, imesa->CurrentTexObj[1]);
|
||||
}
|
||||
|
||||
if (imesa->dirty & I830_UPLOAD_CTX) {
|
||||
memcpy( imesa->sarea->ContextState,
|
||||
imesa->Setup, sizeof(imesa->Setup) );
|
||||
i830DumpContextState(imesa);
|
||||
}
|
||||
|
||||
for(i = 0; i < I830_TEXTURE_COUNT; i++) {
|
||||
if ((imesa->dirty & I830_UPLOAD_TEX_N(i)) && imesa->CurrentTexObj[i]) {
|
||||
unsigned * TexState;
|
||||
|
||||
imesa->sarea->dirty |= I830_UPLOAD_TEX_N(i);
|
||||
|
||||
switch( i ) {
|
||||
case 0:
|
||||
case 1:
|
||||
TexState = imesa->sarea->TexState[i];
|
||||
break;
|
||||
|
||||
case 2:
|
||||
TexState = imesa->sarea->TexState2;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
TexState = imesa->sarea->TexState3;
|
||||
break;
|
||||
}
|
||||
|
||||
memcpy(TexState, imesa->CurrentTexObj[i]->Setup,
|
||||
sizeof(imesa->sarea->TexState[i]));
|
||||
i830DumpTextureState(imesa, i);
|
||||
}
|
||||
}
|
||||
/* Need to figure out if texturing state, or enable changed. */
|
||||
|
||||
for(i = 0; i < I830_TEXBLEND_COUNT; i++) {
|
||||
if (imesa->dirty & I830_UPLOAD_TEXBLEND_N(i)) {
|
||||
unsigned * TexBlendState;
|
||||
unsigned * words_used;
|
||||
|
||||
imesa->sarea->dirty |= I830_UPLOAD_TEXBLEND_N(i);
|
||||
|
||||
switch( i ) {
|
||||
case 0:
|
||||
case 1:
|
||||
TexBlendState = imesa->sarea->TexBlendState[i];
|
||||
words_used = & imesa->sarea->TexBlendStateWordsUsed[i];
|
||||
break;
|
||||
|
||||
case 2:
|
||||
TexBlendState = imesa->sarea->TexBlendState2;
|
||||
words_used = & imesa->sarea->TexBlendStateWordsUsed2;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
TexBlendState = imesa->sarea->TexBlendState3;
|
||||
words_used = & imesa->sarea->TexBlendStateWordsUsed3;
|
||||
break;
|
||||
}
|
||||
|
||||
memcpy(TexBlendState, imesa->TexBlend[i],
|
||||
imesa->TexBlendWordsUsed[i] * 4);
|
||||
*words_used = imesa->TexBlendWordsUsed[i];
|
||||
|
||||
i830DumpTextureBlendState(imesa, i);
|
||||
}
|
||||
}
|
||||
|
||||
if (imesa->dirty & I830_UPLOAD_BUFFERS) {
|
||||
memcpy( imesa->sarea->BufferState,imesa->BufferSetup,
|
||||
sizeof(imesa->BufferSetup) );
|
||||
i830DumpBufferState(imesa);
|
||||
}
|
||||
|
||||
if (imesa->dirty & I830_UPLOAD_STIPPLE) {
|
||||
fprintf(stderr, "UPLOAD_STIPPLE\n");
|
||||
memcpy( imesa->sarea->StippleState,imesa->StippleSetup,
|
||||
sizeof(imesa->StippleSetup) );
|
||||
i830DumpStippleState(imesa);
|
||||
}
|
||||
|
||||
if (imesa->dirty & I830_UPLOAD_TEX_PALETTE_SHARED) {
|
||||
memcpy( imesa->sarea->Palette[0],imesa->palette,
|
||||
sizeof(imesa->sarea->Palette[0]));
|
||||
} else {
|
||||
i830TextureObjectPtr p;
|
||||
if (imesa->dirty & I830_UPLOAD_TEX_PALETTE_N(0)) {
|
||||
p = imesa->CurrentTexObj[0];
|
||||
memcpy( imesa->sarea->Palette[0],p->palette,
|
||||
sizeof(imesa->sarea->Palette[0]));
|
||||
}
|
||||
if (imesa->dirty & I830_UPLOAD_TEX_PALETTE_N(1)) {
|
||||
p = imesa->CurrentTexObj[1];
|
||||
memcpy( imesa->sarea->Palette[1],
|
||||
p->palette,
|
||||
sizeof(imesa->sarea->Palette[1]));
|
||||
}
|
||||
}
|
||||
imesa->sarea->dirty |= (imesa->dirty & ~(I830_UPLOAD_TEX_MASK |
|
||||
I830_UPLOAD_TEXBLEND_MASK));
|
||||
|
||||
imesa->upload_cliprects = GL_TRUE;
|
||||
imesa->dirty = 0;
|
||||
}
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 2001 2d3d Inc., Delray Beach, FL
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_debug.h,v 1.3 2002/12/10 01:26:53 dawes Exp $ */
|
||||
|
||||
/*
|
||||
* Author:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*/
|
||||
|
||||
/* Defines for sanity checking and debug output */
|
||||
#ifndef I830DEBUG_INC
|
||||
#define I830DEBUG_INC
|
||||
|
||||
|
||||
void i830DumpContextState( i830ContextPtr imesa );
|
||||
void i830DumpStippleState( i830ContextPtr imesa );
|
||||
void i830DumpBufferState( i830ContextPtr imesa );
|
||||
void i830DumpTextureState( i830ContextPtr imesa, int unit );
|
||||
void i830DumpTextureBlendState( i830ContextPtr imesa, int unit );
|
||||
void i830VertexSanity( i830ContextPtr imesa, drmI830Vertex vertex );
|
||||
void i830EmitHwStateLockedDebug( i830ContextPtr imesa );
|
||||
|
||||
#endif
|
||||
|
|
@ -1,841 +0,0 @@
|
|||
|
||||
/**************************************************************************
|
||||
|
||||
Copyright 2001 VA Linux Systems Inc., Fremont, California.
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_ioctl.c,v 1.5 2002/12/10 01:26:53 dawes Exp $ */
|
||||
|
||||
/*
|
||||
* Author:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
* Graeme Fisher <graeme@2d3d.co.za>
|
||||
* Abraham vd Merwe <abraham@2d3d.co.za>
|
||||
*
|
||||
* Heavily based on the I810 driver, which was written by:
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "glheader.h"
|
||||
#include "mtypes.h"
|
||||
#include "macros.h"
|
||||
#include "dd.h"
|
||||
#include "swrast/swrast.h"
|
||||
|
||||
#include "mm.h"
|
||||
|
||||
#include "i830_screen.h"
|
||||
#include "i830_dri.h"
|
||||
|
||||
#include "i830_context.h"
|
||||
#include "i830_ioctl.h"
|
||||
#include "i830_state.h"
|
||||
#include "i830_debug.h"
|
||||
|
||||
#include "drm.h"
|
||||
|
||||
static drmBufPtr i830_get_buffer_ioctl( i830ContextPtr imesa )
|
||||
{
|
||||
drmI830DMA dma;
|
||||
drmBufPtr buf;
|
||||
int retcode,i = 0;
|
||||
while (1) {
|
||||
retcode = drmCommandWriteRead(imesa->driFd,
|
||||
DRM_I830_GETBUF,
|
||||
&dma,
|
||||
sizeof(drmI830DMA));
|
||||
if (dma.granted == 1 && retcode == 0)
|
||||
break;
|
||||
|
||||
if (++i > 1000) {
|
||||
imesa->sarea->perf_boxes |= I830_BOX_WAIT;
|
||||
retcode = drmCommandNone(imesa->driFd, DRM_I830_FLUSH);
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
buf = &(imesa->i830Screen->bufs->list[dma.request_idx]);
|
||||
buf->idx = dma.request_idx;
|
||||
buf->used = 0;
|
||||
buf->total = dma.request_size;
|
||||
buf->address = (drmAddress)dma.virtual;
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void i830ClearDrawQuad(i830ContextPtr imesa, float left,
|
||||
float right,
|
||||
float bottom, float top, GLubyte red,
|
||||
GLubyte green, GLubyte blue, GLubyte alpha)
|
||||
{
|
||||
GLuint *vb = i830AllocDmaLowLocked( imesa, 128 );
|
||||
i830Vertex tmp;
|
||||
int i;
|
||||
|
||||
/* PRIM3D_TRIFAN */
|
||||
|
||||
/* initial vertex, left bottom */
|
||||
tmp.v.x = left;
|
||||
tmp.v.y = bottom;
|
||||
tmp.v.z = 1.0;
|
||||
tmp.v.w = 1.0;
|
||||
tmp.v.color.red = red;
|
||||
tmp.v.color.green = green;
|
||||
tmp.v.color.blue = blue;
|
||||
tmp.v.color.alpha = alpha;
|
||||
tmp.v.specular.red = 0;
|
||||
tmp.v.specular.green = 0;
|
||||
tmp.v.specular.blue = 0;
|
||||
tmp.v.specular.alpha = 0;
|
||||
tmp.v.u0 = 0.0f;
|
||||
tmp.v.v0 = 0.0f;
|
||||
for (i = 0 ; i < 8 ; i++)
|
||||
vb[i] = tmp.ui[i];
|
||||
|
||||
/* right bottom */
|
||||
vb += 8;
|
||||
tmp.v.x = right;
|
||||
for (i = 0 ; i < 8 ; i++)
|
||||
vb[i] = tmp.ui[i];
|
||||
|
||||
/* right top */
|
||||
vb += 8;
|
||||
tmp.v.y = top;
|
||||
for (i = 0 ; i < 8 ; i++)
|
||||
vb[i] = tmp.ui[i];
|
||||
|
||||
/* left top */
|
||||
vb += 8;
|
||||
tmp.v.x = left;
|
||||
for (i = 0 ; i < 8 ; i++)
|
||||
vb[i] = tmp.ui[i];
|
||||
}
|
||||
|
||||
static void i830ClearWithTris(GLcontext *ctx, GLbitfield mask,
|
||||
GLboolean all,
|
||||
GLint cx, GLint cy, GLint cw, GLint ch)
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT( ctx );
|
||||
__DRIdrawablePrivate *dPriv = imesa->driDrawable;
|
||||
i830ScreenPrivate *i830Screen = imesa->i830Screen;
|
||||
I830SAREAPtr sarea = imesa->sarea;
|
||||
GLuint old_vertex_prim;
|
||||
GLuint old_dirty;
|
||||
int x0, y0, x1, y1;
|
||||
|
||||
if (I830_DEBUG & DEBUG_IOCTL)
|
||||
fprintf(stderr, "Clearing with triangles\n");
|
||||
|
||||
old_dirty = imesa->dirty & ~I830_UPLOAD_CLIPRECTS;
|
||||
/* Discard all the dirty flags except the cliprect one, reset later */
|
||||
imesa->dirty &= I830_UPLOAD_CLIPRECTS;
|
||||
|
||||
if(!all) {
|
||||
x0 = cx;
|
||||
y0 = cy;
|
||||
x1 = x0 + cw;
|
||||
y1 = y0 + ch;
|
||||
} else {
|
||||
x0 = 0;
|
||||
y0 = 0;
|
||||
x1 = x0 + dPriv->w;
|
||||
y1 = y0 + dPriv->h;
|
||||
}
|
||||
|
||||
/* Clip to Screen */
|
||||
if (x0 < 0) x0 = 0;
|
||||
if (y0 < 0) y0 = 0;
|
||||
if (x1 > i830Screen->width-1) x1 = i830Screen->width-1;
|
||||
if (y1 > i830Screen->height-1) y1 = i830Screen->height-1;
|
||||
|
||||
LOCK_HARDWARE(imesa);
|
||||
memcpy(sarea->ContextState,
|
||||
imesa->Init_Setup,
|
||||
sizeof(imesa->Setup) );
|
||||
memcpy(sarea->BufferState,
|
||||
imesa->BufferSetup,
|
||||
sizeof(imesa->BufferSetup) );
|
||||
sarea->StippleState[I830_STPREG_ST1] = 0;
|
||||
|
||||
old_vertex_prim = imesa->hw_primitive;
|
||||
imesa->hw_primitive = PRIM3D_TRIFAN;
|
||||
|
||||
if(mask & BUFFER_BIT_FRONT_LEFT) {
|
||||
GLuint tmp = sarea->ContextState[I830_CTXREG_ENABLES_2];
|
||||
|
||||
sarea->dirty |= (I830_UPLOAD_CTX | I830_UPLOAD_BUFFERS |
|
||||
I830_UPLOAD_TEXBLEND0);
|
||||
|
||||
sarea->TexBlendState[0][0] = (STATE3D_MAP_BLEND_OP_CMD(0) |
|
||||
TEXPIPE_COLOR |
|
||||
ENABLE_TEXOUTPUT_WRT_SEL |
|
||||
TEXOP_OUTPUT_CURRENT |
|
||||
DISABLE_TEX_CNTRL_STAGE |
|
||||
TEXOP_SCALE_1X |
|
||||
TEXOP_MODIFY_PARMS |
|
||||
TEXOP_LAST_STAGE |
|
||||
TEXBLENDOP_ARG1);
|
||||
sarea->TexBlendState[0][1] = (STATE3D_MAP_BLEND_OP_CMD(0) |
|
||||
TEXPIPE_ALPHA |
|
||||
ENABLE_TEXOUTPUT_WRT_SEL |
|
||||
TEXOP_OUTPUT_CURRENT |
|
||||
TEXOP_SCALE_1X |
|
||||
TEXOP_MODIFY_PARMS |
|
||||
TEXBLENDOP_ARG1);
|
||||
sarea->TexBlendState[0][2] = (STATE3D_MAP_BLEND_ARG_CMD(0) |
|
||||
TEXPIPE_COLOR |
|
||||
TEXBLEND_ARG1 |
|
||||
TEXBLENDARG_MODIFY_PARMS |
|
||||
TEXBLENDARG_CURRENT);
|
||||
sarea->TexBlendState[0][3] = (STATE3D_MAP_BLEND_ARG_CMD(0) |
|
||||
TEXPIPE_ALPHA |
|
||||
TEXBLEND_ARG1 |
|
||||
TEXBLENDARG_MODIFY_PARMS |
|
||||
TEXBLENDARG_CURRENT);
|
||||
sarea->TexBlendStateWordsUsed[0] = 4;
|
||||
|
||||
tmp &= ~(ENABLE_STENCIL_WRITE | ENABLE_DEPTH_WRITE);
|
||||
tmp |= (DISABLE_STENCIL_WRITE |
|
||||
DISABLE_DEPTH_WRITE |
|
||||
(imesa->mask_red << WRITEMASK_RED_SHIFT) |
|
||||
(imesa->mask_green << WRITEMASK_GREEN_SHIFT) |
|
||||
(imesa->mask_blue << WRITEMASK_BLUE_SHIFT) |
|
||||
(imesa->mask_alpha << WRITEMASK_ALPHA_SHIFT));
|
||||
sarea->ContextState[I830_CTXREG_ENABLES_2] = tmp;
|
||||
|
||||
if(0)
|
||||
fprintf(stderr, "fcdq : r_mask(%d) g_mask(%d) b_mask(%d) a_mask(%d)\n",
|
||||
imesa->mask_red, imesa->mask_green, imesa->mask_blue,
|
||||
imesa->mask_alpha);
|
||||
|
||||
sarea->BufferState[I830_DESTREG_CBUFADDR] = i830Screen->fbOffset;
|
||||
|
||||
if(0)
|
||||
fprintf(stderr, "fcdq : x0(%d) x1(%d) y0(%d) y1(%d)\n"
|
||||
"r(0x%x) g(0x%x) b(0x%x) a(0x%x)\n",
|
||||
x0, x1, y0, y1, imesa->clear_red, imesa->clear_green,
|
||||
imesa->clear_blue, imesa->clear_alpha);
|
||||
|
||||
i830ClearDrawQuad(imesa, (float)x0, (float)x1, (float)y0, (float)y1,
|
||||
imesa->clear_red, imesa->clear_green,
|
||||
imesa->clear_blue, imesa->clear_alpha);
|
||||
i830FlushPrimsLocked( imesa );
|
||||
}
|
||||
|
||||
if(mask & BUFFER_BIT_BACK_LEFT) {
|
||||
GLuint tmp = sarea->ContextState[I830_CTXREG_ENABLES_2];
|
||||
|
||||
sarea->dirty |= (I830_UPLOAD_CTX | I830_UPLOAD_BUFFERS |
|
||||
I830_UPLOAD_TEXBLEND0);
|
||||
|
||||
sarea->TexBlendState[0][0] = (STATE3D_MAP_BLEND_OP_CMD(0) |
|
||||
TEXPIPE_COLOR |
|
||||
ENABLE_TEXOUTPUT_WRT_SEL |
|
||||
TEXOP_OUTPUT_CURRENT |
|
||||
DISABLE_TEX_CNTRL_STAGE |
|
||||
TEXOP_SCALE_1X |
|
||||
TEXOP_MODIFY_PARMS |
|
||||
TEXOP_LAST_STAGE |
|
||||
TEXBLENDOP_ARG1);
|
||||
sarea->TexBlendState[0][1] = (STATE3D_MAP_BLEND_OP_CMD(0) |
|
||||
TEXPIPE_ALPHA |
|
||||
ENABLE_TEXOUTPUT_WRT_SEL |
|
||||
TEXOP_OUTPUT_CURRENT |
|
||||
TEXOP_SCALE_1X |
|
||||
TEXOP_MODIFY_PARMS |
|
||||
TEXBLENDOP_ARG1);
|
||||
sarea->TexBlendState[0][2] = (STATE3D_MAP_BLEND_ARG_CMD(0) |
|
||||
TEXPIPE_COLOR |
|
||||
TEXBLEND_ARG1 |
|
||||
TEXBLENDARG_MODIFY_PARMS |
|
||||
TEXBLENDARG_CURRENT);
|
||||
sarea->TexBlendState[0][3] = (STATE3D_MAP_BLEND_ARG_CMD(0) |
|
||||
TEXPIPE_ALPHA |
|
||||
TEXBLEND_ARG2 |
|
||||
TEXBLENDARG_MODIFY_PARMS |
|
||||
TEXBLENDARG_CURRENT);
|
||||
sarea->TexBlendStateWordsUsed[0] = 4;
|
||||
|
||||
tmp &= ~(ENABLE_STENCIL_WRITE | ENABLE_DEPTH_WRITE);
|
||||
tmp |= (DISABLE_STENCIL_WRITE |
|
||||
DISABLE_DEPTH_WRITE |
|
||||
(imesa->mask_red << WRITEMASK_RED_SHIFT) |
|
||||
(imesa->mask_green << WRITEMASK_GREEN_SHIFT) |
|
||||
(imesa->mask_blue << WRITEMASK_BLUE_SHIFT) |
|
||||
(imesa->mask_alpha << WRITEMASK_ALPHA_SHIFT));
|
||||
|
||||
if(0)
|
||||
fprintf(stderr, "bcdq : r_mask(%d) g_mask(%d) b_mask(%d) a_mask(%d)\n",
|
||||
imesa->mask_red, imesa->mask_green, imesa->mask_blue,
|
||||
imesa->mask_alpha);
|
||||
|
||||
sarea->ContextState[I830_CTXREG_ENABLES_2] = tmp;
|
||||
|
||||
sarea->BufferState[I830_DESTREG_CBUFADDR] = i830Screen->backOffset;
|
||||
|
||||
if(0)
|
||||
fprintf(stderr, "bcdq : x0(%d) x1(%d) y0(%d) y1(%d)\n"
|
||||
"r(0x%x) g(0x%x) b(0x%x) a(0x%x)\n",
|
||||
x0, x1, y0, y1, imesa->clear_red, imesa->clear_green,
|
||||
imesa->clear_blue, imesa->clear_alpha);
|
||||
|
||||
i830ClearDrawQuad(imesa, (float)x0, (float)x1, (float)y0, (float)y1,
|
||||
imesa->clear_red, imesa->clear_green,
|
||||
imesa->clear_blue, imesa->clear_alpha);
|
||||
i830FlushPrimsLocked( imesa );
|
||||
}
|
||||
|
||||
if(mask & BUFFER_BIT_STENCIL) {
|
||||
GLuint s_mask = ctx->Stencil.WriteMask[0];
|
||||
|
||||
sarea->dirty |= (I830_UPLOAD_CTX | I830_UPLOAD_BUFFERS |
|
||||
I830_UPLOAD_TEXBLEND0);
|
||||
|
||||
sarea->TexBlendState[0][0] = (STATE3D_MAP_BLEND_OP_CMD(0) |
|
||||
TEXPIPE_COLOR |
|
||||
ENABLE_TEXOUTPUT_WRT_SEL |
|
||||
TEXOP_OUTPUT_CURRENT |
|
||||
DISABLE_TEX_CNTRL_STAGE |
|
||||
TEXOP_SCALE_1X |
|
||||
TEXOP_MODIFY_PARMS |
|
||||
TEXOP_LAST_STAGE |
|
||||
TEXBLENDOP_ARG1);
|
||||
sarea->TexBlendState[0][1] = (STATE3D_MAP_BLEND_OP_CMD(0) |
|
||||
TEXPIPE_ALPHA |
|
||||
ENABLE_TEXOUTPUT_WRT_SEL |
|
||||
TEXOP_OUTPUT_CURRENT |
|
||||
TEXOP_SCALE_1X |
|
||||
TEXOP_MODIFY_PARMS |
|
||||
TEXBLENDOP_ARG1);
|
||||
sarea->TexBlendState[0][2] = (STATE3D_MAP_BLEND_ARG_CMD(0) |
|
||||
TEXPIPE_COLOR |
|
||||
TEXBLEND_ARG1 |
|
||||
TEXBLENDARG_MODIFY_PARMS |
|
||||
TEXBLENDARG_CURRENT);
|
||||
sarea->TexBlendState[0][3] = (STATE3D_MAP_BLEND_ARG_CMD(0) |
|
||||
TEXPIPE_ALPHA |
|
||||
TEXBLEND_ARG2 |
|
||||
TEXBLENDARG_MODIFY_PARMS |
|
||||
TEXBLENDARG_CURRENT);
|
||||
sarea->TexBlendStateWordsUsed[0] = 4;
|
||||
|
||||
sarea->ContextState[I830_CTXREG_ENABLES_1] |= (ENABLE_STENCIL_TEST |
|
||||
ENABLE_DEPTH_TEST);
|
||||
|
||||
sarea->ContextState[I830_CTXREG_ENABLES_2] &= ~(ENABLE_STENCIL_WRITE |
|
||||
ENABLE_DEPTH_WRITE |
|
||||
ENABLE_COLOR_WRITE);
|
||||
|
||||
sarea->ContextState[I830_CTXREG_ENABLES_2] |=
|
||||
(ENABLE_STENCIL_WRITE |
|
||||
DISABLE_DEPTH_WRITE |
|
||||
(1 << WRITEMASK_RED_SHIFT) |
|
||||
(1 << WRITEMASK_GREEN_SHIFT) |
|
||||
(1 << WRITEMASK_BLUE_SHIFT) |
|
||||
(1 << WRITEMASK_ALPHA_SHIFT) |
|
||||
ENABLE_COLOR_WRITE);
|
||||
|
||||
sarea->ContextState[I830_CTXREG_STATE4] &=
|
||||
~MODE4_ENABLE_STENCIL_WRITE_MASK;
|
||||
|
||||
sarea->ContextState[I830_CTXREG_STATE4] |=
|
||||
(ENABLE_STENCIL_WRITE_MASK |
|
||||
STENCIL_WRITE_MASK(s_mask));
|
||||
|
||||
sarea->ContextState[I830_CTXREG_STENCILTST] &=
|
||||
~(STENCIL_OPS_MASK |
|
||||
STENCIL_REF_VALUE_MASK |
|
||||
ENABLE_STENCIL_TEST_FUNC_MASK);
|
||||
|
||||
sarea->ContextState[I830_CTXREG_STENCILTST] |=
|
||||
(ENABLE_STENCIL_PARMS |
|
||||
ENABLE_STENCIL_REF_VALUE |
|
||||
ENABLE_STENCIL_TEST_FUNC |
|
||||
STENCIL_FAIL_OP(STENCILOP_REPLACE) |
|
||||
STENCIL_PASS_DEPTH_FAIL_OP(STENCILOP_REPLACE) |
|
||||
STENCIL_PASS_DEPTH_PASS_OP(STENCILOP_REPLACE) |
|
||||
STENCIL_REF_VALUE((ctx->Stencil.Clear & 0xff)) |
|
||||
STENCIL_TEST_FUNC(COMPAREFUNC_ALWAYS));
|
||||
|
||||
if(0)
|
||||
fprintf(stderr, "Enables_1 (0x%x) Enables_2 (0x%x) StenTst (0x%x)\n"
|
||||
"Modes_4 (0x%x)\n",
|
||||
sarea->ContextState[I830_CTXREG_ENABLES_1],
|
||||
sarea->ContextState[I830_CTXREG_ENABLES_2],
|
||||
sarea->ContextState[I830_CTXREG_STENCILTST],
|
||||
sarea->ContextState[I830_CTXREG_STATE4]);
|
||||
|
||||
sarea->BufferState[I830_DESTREG_CBUFADDR] = i830Screen->fbOffset;
|
||||
|
||||
i830ClearDrawQuad(imesa, (float)x0, (float)x1, (float)y0, (float)y1,
|
||||
255, 255, 255, 255);
|
||||
i830FlushPrimsLocked( imesa );
|
||||
}
|
||||
|
||||
UNLOCK_HARDWARE(imesa);
|
||||
imesa->dirty = old_dirty;
|
||||
imesa->dirty |= (I830_UPLOAD_CTX |
|
||||
I830_UPLOAD_BUFFERS |
|
||||
I830_UPLOAD_TEXBLEND0);
|
||||
|
||||
imesa->hw_primitive = old_vertex_prim;
|
||||
}
|
||||
|
||||
static void i830Clear(GLcontext *ctx, GLbitfield mask, GLboolean all,
|
||||
GLint cx1, GLint cy1, GLint cw, GLint ch)
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT( ctx );
|
||||
__DRIdrawablePrivate *dPriv = imesa->driDrawable;
|
||||
const GLuint colorMask = *((GLuint *) &ctx->Color.ColorMask);
|
||||
drmI830Clear clear;
|
||||
GLbitfield tri_mask = 0;
|
||||
int i;
|
||||
GLint cx, cy;
|
||||
|
||||
/* flip top to bottom */
|
||||
cy = dPriv->h-cy1-ch;
|
||||
cx = cx1 + imesa->drawX;
|
||||
cy += imesa->drawY;
|
||||
|
||||
if(0) fprintf(stderr, "\nClearColor : 0x%08x\n", imesa->ClearColor);
|
||||
|
||||
clear.flags = 0;
|
||||
clear.clear_color = imesa->ClearColor;
|
||||
clear.clear_depth = 0;
|
||||
clear.clear_colormask = 0;
|
||||
clear.clear_depthmask = 0;
|
||||
|
||||
I830_FIREVERTICES( imesa );
|
||||
|
||||
if (mask & BUFFER_BIT_FRONT_LEFT) {
|
||||
if(colorMask == ~0) {
|
||||
clear.flags |= I830_FRONT;
|
||||
} else {
|
||||
tri_mask |= BUFFER_BIT_FRONT_LEFT;
|
||||
}
|
||||
mask &= ~BUFFER_BIT_FRONT_LEFT;
|
||||
}
|
||||
|
||||
if (mask & BUFFER_BIT_BACK_LEFT) {
|
||||
if(colorMask == ~0) {
|
||||
clear.flags |= I830_BACK;
|
||||
} else {
|
||||
tri_mask |= BUFFER_BIT_BACK_LEFT;
|
||||
}
|
||||
mask &= ~BUFFER_BIT_BACK_LEFT;
|
||||
}
|
||||
|
||||
if (mask & BUFFER_BIT_DEPTH) {
|
||||
clear.flags |= I830_DEPTH;
|
||||
clear.clear_depthmask = imesa->depth_clear_mask;
|
||||
clear.clear_depth = (GLuint)(ctx->Depth.Clear * imesa->ClearDepth);
|
||||
mask &= ~BUFFER_BIT_DEPTH;
|
||||
}
|
||||
|
||||
if((mask & BUFFER_BIT_STENCIL) && imesa->hw_stencil) {
|
||||
if (ctx->Stencil.WriteMask[0] != 0xff) {
|
||||
tri_mask |= BUFFER_BIT_STENCIL;
|
||||
} else {
|
||||
clear.flags |= I830_DEPTH;
|
||||
clear.clear_depthmask |= imesa->stencil_clear_mask;
|
||||
clear.clear_depth |= (ctx->Stencil.Clear & 0xff) << 24;
|
||||
}
|
||||
mask &= ~BUFFER_BIT_STENCIL;
|
||||
}
|
||||
|
||||
/* First check for clears that need to happen with triangles */
|
||||
if(tri_mask) {
|
||||
i830ClearWithTris(ctx, tri_mask, all, cx, cy, cw, ch);
|
||||
}
|
||||
|
||||
if (clear.flags) {
|
||||
LOCK_HARDWARE( imesa );
|
||||
|
||||
for (i = 0 ; i < imesa->numClipRects ; )
|
||||
{
|
||||
int nr = MIN2(i + I830_NR_SAREA_CLIPRECTS, imesa->numClipRects);
|
||||
drm_clip_rect_t *box = imesa->pClipRects;
|
||||
drm_clip_rect_t *b = (drm_clip_rect_t *)imesa->sarea->boxes;
|
||||
int n = 0;
|
||||
|
||||
if (!all) {
|
||||
for ( ; i < nr ; i++) {
|
||||
GLint x = box[i].x1;
|
||||
GLint y = box[i].y1;
|
||||
GLint w = box[i].x2 - x;
|
||||
GLint h = box[i].y2 - y;
|
||||
|
||||
if (x < cx) w -= cx - x, x = cx;
|
||||
if (y < cy) h -= cy - y, y = cy;
|
||||
if (x + w > cx + cw) w = cx + cw - x;
|
||||
if (y + h > cy + ch) h = cy + ch - y;
|
||||
if (w <= 0) continue;
|
||||
if (h <= 0) continue;
|
||||
|
||||
b->x1 = x;
|
||||
b->y1 = y;
|
||||
b->x2 = x + w;
|
||||
b->y2 = y + h;
|
||||
b++;
|
||||
n++;
|
||||
}
|
||||
} else {
|
||||
for ( ; i < nr ; i++) {
|
||||
*b++ = *(drm_clip_rect_t *)&box[i];
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
imesa->sarea->nbox = n;
|
||||
drmCommandWrite(imesa->driFd, DRM_I830_CLEAR,
|
||||
&clear, sizeof(drmI830Clear));
|
||||
}
|
||||
|
||||
UNLOCK_HARDWARE( imesa );
|
||||
imesa->upload_cliprects = GL_TRUE;
|
||||
}
|
||||
|
||||
if (mask)
|
||||
_swrast_Clear( ctx, mask, all, cx1, cy1, cw, ch );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Copy the back buffer to the front buffer.
|
||||
*/
|
||||
void i830CopyBuffer( const __DRIdrawablePrivate *dPriv )
|
||||
{
|
||||
i830ContextPtr imesa;
|
||||
drm_clip_rect_t *pbox;
|
||||
int nbox, i, tmp;
|
||||
|
||||
assert(dPriv);
|
||||
assert(dPriv->driContextPriv);
|
||||
assert(dPriv->driContextPriv->driverPrivate);
|
||||
|
||||
imesa = (i830ContextPtr) dPriv->driContextPriv->driverPrivate;
|
||||
|
||||
I830_FIREVERTICES( imesa );
|
||||
LOCK_HARDWARE( imesa );
|
||||
|
||||
imesa->sarea->perf_boxes |= imesa->perf_boxes;
|
||||
imesa->perf_boxes = 0;
|
||||
|
||||
pbox = dPriv->pClipRects;
|
||||
nbox = dPriv->numClipRects;
|
||||
|
||||
for (i = 0 ; i < nbox ; )
|
||||
{
|
||||
int nr = MIN2(i + I830_NR_SAREA_CLIPRECTS, dPriv->numClipRects);
|
||||
drm_clip_rect_t *b = (drm_clip_rect_t *)imesa->sarea->boxes;
|
||||
|
||||
imesa->sarea->nbox = nr - i;
|
||||
|
||||
for ( ; i < nr ; i++)
|
||||
*b++ = pbox[i];
|
||||
drmCommandNone(imesa->driFd, DRM_I830_SWAP);
|
||||
}
|
||||
|
||||
tmp = GET_ENQUEUE_AGE(imesa);
|
||||
UNLOCK_HARDWARE( imesa );
|
||||
|
||||
/* multiarb will suck the life out of the server without this throttle:
|
||||
*/
|
||||
if (GET_DISPATCH_AGE(imesa) < imesa->lastSwap) {
|
||||
i830WaitAge(imesa, imesa->lastSwap);
|
||||
}
|
||||
|
||||
imesa->lastSwap = tmp;
|
||||
imesa->upload_cliprects = GL_TRUE;
|
||||
}
|
||||
|
||||
/* Flip the front & back buffes
|
||||
*/
|
||||
void i830PageFlip( const __DRIdrawablePrivate *dPriv )
|
||||
{
|
||||
#if 0
|
||||
i830ContextPtr imesa;
|
||||
int tmp, ret;
|
||||
|
||||
if (I830_DEBUG & DEBUG_IOCTL)
|
||||
fprintf(stderr, "%s\n", __FUNCTION__);
|
||||
|
||||
assert(dPriv);
|
||||
assert(dPriv->driContextPriv);
|
||||
assert(dPriv->driContextPriv->driverPrivate);
|
||||
|
||||
imesa = (i830ContextPtr) dPriv->driContextPriv->driverPrivate;
|
||||
|
||||
I830_FIREVERTICES( imesa );
|
||||
LOCK_HARDWARE( imesa );
|
||||
|
||||
imesa->sarea->perf_boxes |= imesa->perf_boxes;
|
||||
imesa->perf_boxes = 0;
|
||||
|
||||
if (dPriv->pClipRects) {
|
||||
*(drm_clip_rect_t *)imesa->sarea->boxes = dPriv->pClipRects[0];
|
||||
imesa->sarea->nbox = 1;
|
||||
}
|
||||
|
||||
ret = drmCommandNone(imesa->driFd, DRM_I830_FLIP);
|
||||
if (ret) {
|
||||
fprintf(stderr, "%s: %d\n", __FUNCTION__, ret);
|
||||
UNLOCK_HARDWARE( imesa );
|
||||
exit(1);
|
||||
}
|
||||
|
||||
tmp = GET_ENQUEUE_AGE(imesa);
|
||||
UNLOCK_HARDWARE( imesa );
|
||||
|
||||
/* multiarb will suck the life out of the server without this throttle:
|
||||
*/
|
||||
if (GET_DISPATCH_AGE(imesa) < imesa->lastSwap) {
|
||||
i830WaitAge(imesa, imesa->lastSwap);
|
||||
}
|
||||
|
||||
i830SetDrawBuffer( imesa->glCtx, imesa->glCtx->Color.DriverDrawBuffer );
|
||||
imesa->upload_cliprects = GL_TRUE;
|
||||
imesa->lastSwap = tmp;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* This waits for *everybody* to finish rendering -- overkill.
|
||||
*/
|
||||
void i830DmaFinish( i830ContextPtr imesa )
|
||||
{
|
||||
I830_FIREVERTICES( imesa );
|
||||
LOCK_HARDWARE_QUIESCENT( imesa );
|
||||
UNLOCK_HARDWARE( imesa );
|
||||
}
|
||||
|
||||
void i830RegetLockQuiescent( i830ContextPtr imesa )
|
||||
{
|
||||
drmUnlock(imesa->driFd, imesa->hHWContext);
|
||||
i830GetLock( imesa, DRM_LOCK_QUIESCENT );
|
||||
}
|
||||
|
||||
void i830WaitAgeLocked( i830ContextPtr imesa, int age )
|
||||
{
|
||||
int i = 0;
|
||||
while (++i < 5000) {
|
||||
drmCommandNone(imesa->driFd, DRM_I830_GETAGE);
|
||||
if (GET_DISPATCH_AGE(imesa) >= age) return;
|
||||
imesa->sarea->perf_boxes |= I830_BOX_WAIT;
|
||||
UNLOCK_HARDWARE( imesa );
|
||||
if (I830_DEBUG & DEBUG_SLEEP) fprintf(stderr, ".");
|
||||
usleep(1);
|
||||
LOCK_HARDWARE( imesa );
|
||||
}
|
||||
/* If that didn't work, just do a flush:
|
||||
*/
|
||||
drmCommandNone(imesa->driFd, DRM_I830_FLUSH);
|
||||
}
|
||||
|
||||
void i830WaitAge( i830ContextPtr imesa, int age )
|
||||
{
|
||||
int i = 0;
|
||||
if (GET_DISPATCH_AGE(imesa) >= age) return;
|
||||
|
||||
while (1) {
|
||||
drmCommandNone(imesa->driFd, DRM_I830_GETAGE);
|
||||
if (GET_DISPATCH_AGE(imesa) >= age) return;
|
||||
imesa->perf_boxes |= I830_BOX_WAIT;
|
||||
|
||||
if (imesa->do_irqs) {
|
||||
drmI830IrqEmit ie;
|
||||
drmI830IrqWait iw;
|
||||
int ret;
|
||||
|
||||
ie.irq_seq = &iw.irq_seq;
|
||||
|
||||
LOCK_HARDWARE( imesa );
|
||||
ret = drmCommandWriteRead( imesa->driFd, DRM_I830_IRQ_EMIT, &ie, sizeof(ie) );
|
||||
if ( ret ) {
|
||||
fprintf( stderr, "%s: drmI830IrqEmit: %d\n", __FUNCTION__, ret );
|
||||
exit(1);
|
||||
}
|
||||
UNLOCK_HARDWARE(imesa);
|
||||
|
||||
ret = drmCommandWrite( imesa->driFd, DRM_I830_IRQ_WAIT, &iw, sizeof(iw) );
|
||||
if ( ret ) {
|
||||
fprintf( stderr, "%s: drmI830IrqWait: %d\n", __FUNCTION__, ret );
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
if (++i > 5000) usleep(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void age_imesa( i830ContextPtr imesa, int age )
|
||||
{
|
||||
if (imesa->CurrentTexObj[0]) imesa->CurrentTexObj[0]->base.timestamp = age;
|
||||
if (imesa->CurrentTexObj[1]) imesa->CurrentTexObj[1]->base.timestamp = age;
|
||||
}
|
||||
|
||||
void i830FlushPrimsLocked( i830ContextPtr imesa )
|
||||
{
|
||||
drm_clip_rect_t *pbox = imesa->pClipRects;
|
||||
int nbox = imesa->numClipRects;
|
||||
drmBufPtr buffer = imesa->vertex_buffer;
|
||||
I830SAREAPtr sarea = imesa->sarea;
|
||||
drmI830Vertex vertex;
|
||||
int i, nr;
|
||||
|
||||
if (I830_DEBUG & DEBUG_IOCTL)
|
||||
fprintf(stderr, "%s dirty: %08x\n", __FUNCTION__, imesa->dirty);
|
||||
|
||||
|
||||
vertex.idx = buffer->idx;
|
||||
vertex.used = imesa->vertex_low;
|
||||
vertex.discard = 0;
|
||||
sarea->vertex_prim = imesa->hw_primitive;
|
||||
|
||||
/* Reset imesa vars:
|
||||
*/
|
||||
imesa->vertex_buffer = 0;
|
||||
imesa->vertex_addr = 0;
|
||||
imesa->vertex_low = 0;
|
||||
imesa->vertex_high = 0;
|
||||
imesa->vertex_last_prim = 0;
|
||||
|
||||
if (imesa->dirty) {
|
||||
if (I830_DEBUG & DEBUG_SANITY)
|
||||
i830EmitHwStateLockedDebug(imesa);
|
||||
else
|
||||
i830EmitHwStateLocked(imesa);
|
||||
}
|
||||
|
||||
if (I830_DEBUG & DEBUG_IOCTL)
|
||||
fprintf(stderr,"%s: Vertex idx %d used %d discard %d\n",
|
||||
__FUNCTION__, vertex.idx, vertex.used, vertex.discard);
|
||||
|
||||
if (!nbox) {
|
||||
vertex.used = 0;
|
||||
vertex.discard = 1;
|
||||
if (drmCommandWrite (imesa->driFd, DRM_I830_VERTEX,
|
||||
&vertex, sizeof(drmI830Vertex))) {
|
||||
fprintf(stderr, "DRM_I830_VERTEX: %d\n", -errno);
|
||||
UNLOCK_HARDWARE(imesa);
|
||||
exit(1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < nbox ; i = nr ) {
|
||||
drm_clip_rect_t *b = sarea->boxes;
|
||||
int j;
|
||||
|
||||
nr = MIN2(i + I830_NR_SAREA_CLIPRECTS, nbox);
|
||||
sarea->nbox = nr - i;
|
||||
|
||||
for ( j = i ; j < nr ; j++) {
|
||||
b[j-i] = pbox[j];
|
||||
}
|
||||
|
||||
/* Finished with the buffer?
|
||||
*/
|
||||
if (nr == nbox)
|
||||
vertex.discard = 1;
|
||||
|
||||
/* Do a bunch of sanity checks on the vertices sent to the hardware */
|
||||
if (I830_DEBUG & DEBUG_SANITY) {
|
||||
i830VertexSanity(imesa, vertex);
|
||||
|
||||
for ( j = 0 ; j < sarea->nbox ; j++) {
|
||||
fprintf(stderr, "box %d/%d %d,%d %d,%d\n",
|
||||
j, sarea->nbox, b[j].x1, b[j].y1, b[j].x2, b[j].y2);
|
||||
}
|
||||
}
|
||||
|
||||
drmCommandWrite (imesa->driFd, DRM_I830_VERTEX,
|
||||
&vertex, sizeof(drmI830Vertex));
|
||||
age_imesa(imesa, imesa->sarea->last_enqueue);
|
||||
}
|
||||
|
||||
imesa->dirty = 0;
|
||||
imesa->upload_cliprects = GL_FALSE;
|
||||
}
|
||||
|
||||
void i830FlushPrimsGetBufferLocked( i830ContextPtr imesa )
|
||||
{
|
||||
if (imesa->vertex_buffer)
|
||||
i830FlushPrimsLocked( imesa );
|
||||
imesa->vertex_buffer = i830_get_buffer_ioctl( imesa );
|
||||
imesa->vertex_addr = (char *)imesa->vertex_buffer->address;
|
||||
|
||||
/* leave room for instruction header & footer:
|
||||
*/
|
||||
imesa->vertex_high = imesa->vertex_buffer->total - 4;
|
||||
imesa->vertex_low = 4;
|
||||
imesa->vertex_last_prim = imesa->vertex_low;
|
||||
}
|
||||
|
||||
void i830FlushPrimsGetBuffer( i830ContextPtr imesa )
|
||||
{
|
||||
LOCK_HARDWARE(imesa);
|
||||
i830FlushPrimsGetBufferLocked( imesa );
|
||||
UNLOCK_HARDWARE(imesa);
|
||||
}
|
||||
|
||||
|
||||
void i830FlushPrims( i830ContextPtr imesa )
|
||||
{
|
||||
if (imesa->vertex_buffer) {
|
||||
LOCK_HARDWARE( imesa );
|
||||
i830FlushPrimsLocked( imesa );
|
||||
UNLOCK_HARDWARE( imesa );
|
||||
}
|
||||
}
|
||||
|
||||
int i830_check_copy(int fd)
|
||||
{
|
||||
return drmCommandNone(fd, DRM_I830_DOCOPY);
|
||||
}
|
||||
|
||||
static void i830Flush( GLcontext *ctx )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT( ctx );
|
||||
I830_FIREVERTICES( imesa );
|
||||
}
|
||||
|
||||
static void i830Finish( GLcontext *ctx )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT( ctx );
|
||||
i830DmaFinish( imesa );
|
||||
}
|
||||
|
||||
void i830InitIoctlFuncs( struct dd_function_table *functions )
|
||||
{
|
||||
functions->Flush = i830Flush;
|
||||
functions->Clear = i830Clear;
|
||||
functions->Finish = i830Finish;
|
||||
}
|
||||
|
||||
|
|
@ -1,105 +0,0 @@
|
|||
|
||||
/**************************************************************************
|
||||
|
||||
Copyright 2001 VA Linux Systems Inc., Fremont, California.
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_ioctl.h,v 1.3 2002/10/30 12:51:35 alanh Exp $ */
|
||||
|
||||
/*
|
||||
* Author:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
* Graeme Fisher <graeme@2d3d.co.za>
|
||||
* Abraham vd Merwe <abraham@2d3d.co.za>
|
||||
*
|
||||
* Heavily based on the I810 driver, which was written by:
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#ifndef I830_IOCTL_H
|
||||
#define I830_IOCTL_H
|
||||
|
||||
#include "i830_context.h"
|
||||
|
||||
GLuint *i830AllocDwords (i830ContextPtr imesa, int dwords);
|
||||
void i830EmitPrim( i830ContextPtr imesa );
|
||||
void i830FlushPrims( i830ContextPtr mmesa );
|
||||
void i830FlushPrimsLocked( i830ContextPtr mmesa );
|
||||
void i830FlushPrimsGetBuffer( i830ContextPtr imesa );
|
||||
void i830FlushPrimsGetBufferLocked( i830ContextPtr imesa );
|
||||
void i830WaitAgeLocked( i830ContextPtr imesa, int age );
|
||||
void i830WaitAge( i830ContextPtr imesa, int age );
|
||||
void i830DmaFinish( i830ContextPtr imesa );
|
||||
void i830RegetLockQuiescent( i830ContextPtr imesa );
|
||||
void i830InitIoctlFuncs( struct dd_function_table *functions );
|
||||
void i830CopyBuffer( const __DRIdrawablePrivate *dpriv );
|
||||
void i830PageFlip( const __DRIdrawablePrivate *dpriv );
|
||||
int i830_check_copy(int fd);
|
||||
|
||||
#define I830_STATECHANGE(imesa, flag) \
|
||||
do { \
|
||||
if (imesa->vertex_low != imesa->vertex_last_prim) \
|
||||
i830FlushPrims(imesa); \
|
||||
imesa->dirty |= flag; \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define I830_FIREVERTICES(imesa) \
|
||||
do { \
|
||||
if (imesa->vertex_buffer) { \
|
||||
i830FlushPrims(imesa); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
static __inline GLuint *i830AllocDmaLow( i830ContextPtr imesa, int bytes )
|
||||
{
|
||||
if (imesa->vertex_low + bytes > imesa->vertex_high) {
|
||||
i830FlushPrimsGetBuffer( imesa );
|
||||
}
|
||||
|
||||
{
|
||||
GLuint *start = (GLuint *)(imesa->vertex_addr + imesa->vertex_low);
|
||||
imesa->vertex_low += bytes;
|
||||
return start;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline GLuint *i830AllocDmaLowLocked( i830ContextPtr imesa,
|
||||
int bytes )
|
||||
{
|
||||
if (imesa->vertex_low + bytes > imesa->vertex_high) {
|
||||
i830FlushPrimsGetBufferLocked( imesa );
|
||||
}
|
||||
|
||||
{
|
||||
GLuint *start = (GLuint *)(imesa->vertex_addr + imesa->vertex_low);
|
||||
imesa->vertex_low += bytes;
|
||||
return start;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
|
@ -1,226 +0,0 @@
|
|||
/*
|
||||
* Intel i810 DRI driver for Mesa 3.5
|
||||
*
|
||||
* Copyright (C) 1999-2000 Keith Whitwell All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL KEITH WHITWELL BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Author:
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
* Adapted for use on the I830:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*/
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_render.c,v 1.2 2002/12/10 01:26:53 dawes Exp $ */
|
||||
|
||||
/*
|
||||
* Render unclipped vertex buffers by emitting vertices directly to
|
||||
* dma buffers. Use strip/fan hardware acceleration where possible.
|
||||
*
|
||||
*/
|
||||
#include "glheader.h"
|
||||
#include "context.h"
|
||||
#include "macros.h"
|
||||
#include "imports.h"
|
||||
#include "mtypes.h"
|
||||
#include "enums.h"
|
||||
|
||||
#include "tnl/t_context.h"
|
||||
|
||||
#include "i830_screen.h"
|
||||
#include "i830_dri.h"
|
||||
|
||||
#include "i830_context.h"
|
||||
#include "i830_tris.h"
|
||||
#include "i830_state.h"
|
||||
#include "i830_ioctl.h"
|
||||
|
||||
/*
|
||||
* Render unclipped vertex buffers by emitting vertices directly to
|
||||
* dma buffers. Use strip/fan hardware primitives where possible.
|
||||
* Try to simulate missing primitives with indexed vertices.
|
||||
*/
|
||||
#define HAVE_POINTS 0 /* Has it, but can't use because subpixel has to
|
||||
* be adjusted for points on the I830/I845G
|
||||
*/
|
||||
#define HAVE_LINES 1
|
||||
#define HAVE_LINE_STRIPS 1
|
||||
#define HAVE_TRIANGLES 1
|
||||
#define HAVE_TRI_STRIPS 1
|
||||
#define HAVE_TRI_STRIP_1 0 /* has it, template can't use it yet */
|
||||
#define HAVE_TRI_FANS 1
|
||||
#define HAVE_POLYGONS 1
|
||||
#define HAVE_QUADS 0
|
||||
#define HAVE_QUAD_STRIPS 0
|
||||
|
||||
#define HAVE_ELTS 0
|
||||
|
||||
static GLuint hw_prim[GL_POLYGON+1] = {
|
||||
0,
|
||||
PRIM3D_LINELIST,
|
||||
PRIM3D_LINESTRIP,
|
||||
PRIM3D_LINESTRIP,
|
||||
PRIM3D_TRILIST,
|
||||
PRIM3D_TRISTRIP,
|
||||
PRIM3D_TRIFAN,
|
||||
0,
|
||||
0,
|
||||
PRIM3D_POLY
|
||||
};
|
||||
|
||||
static const GLenum reduced_prim[GL_POLYGON+1] = {
|
||||
GL_POINTS,
|
||||
GL_LINES,
|
||||
GL_LINES,
|
||||
GL_LINES,
|
||||
GL_TRIANGLES,
|
||||
GL_TRIANGLES,
|
||||
GL_TRIANGLES,
|
||||
GL_TRIANGLES,
|
||||
GL_TRIANGLES,
|
||||
GL_TRIANGLES
|
||||
};
|
||||
|
||||
static const int scale_prim[GL_POLYGON+1] = {
|
||||
0, /* fallback case */
|
||||
1,
|
||||
2,
|
||||
2,
|
||||
1,
|
||||
3,
|
||||
3,
|
||||
0, /* fallback case */
|
||||
0, /* fallback case */
|
||||
3
|
||||
};
|
||||
|
||||
|
||||
#define LOCAL_VARS i830ContextPtr imesa = I830_CONTEXT(ctx)
|
||||
#define INIT( prim ) do { \
|
||||
I830_STATECHANGE(imesa, 0); \
|
||||
i830RasterPrimitive( ctx, reduced_prim[prim], hw_prim[prim] ); \
|
||||
} while (0)
|
||||
|
||||
#define FLUSH() I830_FIREVERTICES( imesa )
|
||||
#define GET_CURRENT_VB_MAX_VERTS() \
|
||||
(((int)imesa->vertex_high - (int)imesa->vertex_low) / (imesa->vertex_size*4))
|
||||
#define GET_SUBSEQUENT_VB_MAX_VERTS() \
|
||||
(I830_DMA_BUF_SZ-8) / (imesa->vertex_size * 4)
|
||||
|
||||
|
||||
#define ALLOC_VERTS( nr ) \
|
||||
i830AllocDmaLow( imesa, (nr) * imesa->vertex_size * 4)
|
||||
#define EMIT_VERTS( ctx, j, nr, buf ) \
|
||||
_tnl_emit_vertices_to_buffer(ctx, j, (j)+(nr), buf)
|
||||
|
||||
#define TAG(x) i830_##x
|
||||
#include "tnl_dd/t_dd_dmatmp.h"
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/* Render pipeline stage */
|
||||
/**********************************************************************/
|
||||
|
||||
/* Heuristic for i830, which can only emit a single primitive per dma
|
||||
* buffer, and has only a small number of dma buffers.
|
||||
*/
|
||||
static GLboolean choose_render( struct vertex_buffer *VB, int bufsz )
|
||||
{
|
||||
int nr_prims = 0;
|
||||
int nr_rprims = 0;
|
||||
int nr_rverts = 0;
|
||||
int rprim = 0;
|
||||
int i;
|
||||
|
||||
|
||||
for (i = 0 ; i < VB->PrimitiveCount ; i++)
|
||||
{
|
||||
GLuint prim = VB->Primitive[i].mode;
|
||||
GLuint length = VB->Primitive[i].count;
|
||||
|
||||
if (!length)
|
||||
continue;
|
||||
|
||||
if (!hw_prim[prim & PRIM_MODE_MASK])
|
||||
return GL_FALSE;
|
||||
|
||||
nr_prims++;
|
||||
nr_rverts += length * scale_prim[prim & PRIM_MODE_MASK];
|
||||
|
||||
if (reduced_prim[prim&PRIM_MODE_MASK] != rprim) {
|
||||
nr_rprims++;
|
||||
rprim = reduced_prim[prim&PRIM_MODE_MASK];
|
||||
}
|
||||
}
|
||||
|
||||
nr_prims += i / bufsz;
|
||||
nr_rprims += nr_rverts / bufsz;
|
||||
|
||||
if ((nr_prims > nr_rprims * 2) ||
|
||||
(nr_prims > nr_rprims + 3))
|
||||
return GL_FALSE;
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static GLboolean i830_run_render( GLcontext *ctx,
|
||||
struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
struct vertex_buffer *VB = &tnl->vb;
|
||||
GLuint i;
|
||||
/* Don't handle clipping or indexed vertices.
|
||||
*/
|
||||
if (imesa->RenderIndex != 0 ||
|
||||
!i830_validate_render( ctx, VB ) ||
|
||||
!choose_render( VB, 200 )) { /* 200 is estimate of nr verts/buf */
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
tnl->Driver.Render.Start( ctx );
|
||||
|
||||
for (i = 0 ; i < VB->PrimitiveCount ; i++)
|
||||
{
|
||||
GLuint prim = VB->Primitive[i].mode;
|
||||
GLuint start = VB->Primitive[i].start;
|
||||
GLuint length = VB->Primitive[i].count;
|
||||
|
||||
if (!length)
|
||||
continue;
|
||||
|
||||
i830_render_tab_verts[prim & PRIM_MODE_MASK]( ctx, start, start + length,
|
||||
prim );
|
||||
}
|
||||
|
||||
tnl->Driver.Render.Finish( ctx );
|
||||
|
||||
return GL_FALSE; /* finished the pipe */
|
||||
}
|
||||
|
||||
|
||||
const struct tnl_pipeline_stage _i830_render_stage =
|
||||
{
|
||||
"i830 render",
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
i830_run_render /* run */
|
||||
};
|
||||
|
|
@ -1,554 +0,0 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* **************************************************************************/
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_screen.c,v 1.3 2002/12/10 01:26:53 dawes Exp $ */
|
||||
|
||||
/**
|
||||
* \file i830_screen.c
|
||||
*
|
||||
* Adapted for use on the I830M by Jeff Hartmann.
|
||||
*
|
||||
* \author Keith Whitwell <keith@tungstengraphics.com>
|
||||
* \author Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*/
|
||||
|
||||
|
||||
#include "glheader.h"
|
||||
#include "context.h"
|
||||
#include "matrix.h"
|
||||
#include "simple_list.h"
|
||||
#include "framebuffer.h"
|
||||
#include "renderbuffer.h"
|
||||
|
||||
#include "i830_screen.h"
|
||||
#include "i830_dri.h"
|
||||
|
||||
#include "i830_state.h"
|
||||
#include "i830_tex.h"
|
||||
#include "i830_span.h"
|
||||
#include "i830_tris.h"
|
||||
#include "i830_ioctl.h"
|
||||
|
||||
#include "i830_dri.h"
|
||||
|
||||
#include "utils.h"
|
||||
#include "xmlpool.h"
|
||||
#include "drirenderbuffer.h"
|
||||
|
||||
PUBLIC const char __driConfigOptions[] =
|
||||
DRI_CONF_BEGIN
|
||||
DRI_CONF_SECTION_PERFORMANCE
|
||||
DRI_CONF_MAX_TEXTURE_UNITS(4,2,4)
|
||||
DRI_CONF_FORCE_S3TC_ENABLE(false)
|
||||
DRI_CONF_SECTION_END
|
||||
DRI_CONF_END;
|
||||
const GLuint __driNConfigOptions = 2;
|
||||
|
||||
extern const struct dri_extension card_extensions[];
|
||||
|
||||
static int i830_malloc_proxy_buf(drmBufMapPtr buffers)
|
||||
{
|
||||
char *buffer;
|
||||
drmBufPtr buf;
|
||||
int i;
|
||||
|
||||
buffer = ALIGN_MALLOC(I830_DMA_BUF_SZ, 32);
|
||||
if(buffer == NULL) return -1;
|
||||
for(i = 0; i < I830_DMA_BUF_NR; i++) {
|
||||
buf = &(buffers->list[i]);
|
||||
buf->address = (drmAddress)buffer;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static drmBufMapPtr i830_create_empty_buffers(void)
|
||||
{
|
||||
drmBufMapPtr retval;
|
||||
|
||||
retval = (drmBufMapPtr)ALIGN_MALLOC(sizeof(drmBufMap), 32);
|
||||
if(retval == NULL) return NULL;
|
||||
memset(retval, 0, sizeof(drmBufMap));
|
||||
retval->list = (drmBufPtr)ALIGN_MALLOC(sizeof(drmBuf) * I830_DMA_BUF_NR, 32);
|
||||
if(retval->list == NULL) {
|
||||
FREE(retval);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(retval->list, 0, sizeof(drmBuf) * I830_DMA_BUF_NR);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void i830PrintDRIInfo(i830ScreenPrivate *i830Screen,
|
||||
__DRIscreenPrivate *sPriv,
|
||||
I830DRIPtr gDRIPriv)
|
||||
{
|
||||
GLuint size = (gDRIPriv->ringSize +
|
||||
i830Screen->textureSize +
|
||||
i830Screen->depth.size +
|
||||
i830Screen->back.size +
|
||||
sPriv->fbSize +
|
||||
I830_DMA_BUF_NR * I830_DMA_BUF_SZ +
|
||||
32768 /* Context Memory */ +
|
||||
16*4096 /* Ring buffer */ +
|
||||
64*1024 /* Scratch buffer */ +
|
||||
4096 /* Cursor */);
|
||||
GLuint size_low = (gDRIPriv->ringSize +
|
||||
i830Screen->textureSize +
|
||||
sPriv->fbSize +
|
||||
I830_DMA_BUF_NR * I830_DMA_BUF_SZ +
|
||||
32768 /* Context Memory */ +
|
||||
16*4096 /* Ring buffer */ +
|
||||
64*1024 /* Scratch buffer */);
|
||||
|
||||
fprintf(stderr, "\nFront size : 0x%x\n", sPriv->fbSize);
|
||||
fprintf(stderr, "Front offset : 0x%x\n", i830Screen->fbOffset);
|
||||
fprintf(stderr, "Back size : 0x%x\n", i830Screen->back.size);
|
||||
fprintf(stderr, "Back offset : 0x%x\n", i830Screen->backOffset);
|
||||
fprintf(stderr, "Depth size : 0x%x\n", i830Screen->depth.size);
|
||||
fprintf(stderr, "Depth offset : 0x%x\n", i830Screen->depthOffset);
|
||||
fprintf(stderr, "Texture size : 0x%x\n", i830Screen->textureSize);
|
||||
fprintf(stderr, "Texture offset : 0x%x\n", i830Screen->textureOffset);
|
||||
fprintf(stderr, "Ring offset : 0x%x\n", gDRIPriv->ringOffset);
|
||||
fprintf(stderr, "Ring size : 0x%x\n", gDRIPriv->ringSize);
|
||||
fprintf(stderr, "Memory : 0x%x\n", gDRIPriv->mem);
|
||||
fprintf(stderr, "Used Memory : low(0x%x) high(0x%x)\n", size_low, size);
|
||||
}
|
||||
|
||||
static GLboolean i830InitDriver(__DRIscreenPrivate *sPriv)
|
||||
{
|
||||
i830ScreenPrivate *i830Screen;
|
||||
I830DRIPtr gDRIPriv = (I830DRIPtr)sPriv->pDevPriv;
|
||||
PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
|
||||
(PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
|
||||
void * const psc = sPriv->psc->screenConfigs;
|
||||
|
||||
if (sPriv->devPrivSize != sizeof(I830DRIRec)) {
|
||||
fprintf(stderr,"\nERROR! sizeof(I830DRIRec) does not match passed size from device driver\n");
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* Allocate the private area */
|
||||
i830Screen = (i830ScreenPrivate *)CALLOC(sizeof(i830ScreenPrivate));
|
||||
if (!i830Screen) {
|
||||
fprintf(stderr,"\nERROR! Allocating private area failed\n");
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* parse information in __driConfigOptions */
|
||||
driParseOptionInfo (&i830Screen->optionCache,
|
||||
__driConfigOptions, __driNConfigOptions);
|
||||
|
||||
|
||||
i830Screen->driScrnPriv = sPriv;
|
||||
sPriv->private = (void *)i830Screen;
|
||||
|
||||
i830Screen->deviceID = gDRIPriv->deviceID;
|
||||
i830Screen->width = gDRIPriv->width;
|
||||
i830Screen->height = gDRIPriv->height;
|
||||
i830Screen->mem = gDRIPriv->mem;
|
||||
i830Screen->cpp = gDRIPriv->cpp;
|
||||
i830Screen->fbStride = gDRIPriv->fbStride;
|
||||
i830Screen->fbOffset = gDRIPriv->fbOffset;
|
||||
|
||||
switch (gDRIPriv->bitsPerPixel) {
|
||||
case 15: i830Screen->fbFormat = DV_PF_555; break;
|
||||
case 16: i830Screen->fbFormat = DV_PF_565; break;
|
||||
case 32: i830Screen->fbFormat = DV_PF_8888; break;
|
||||
}
|
||||
|
||||
i830Screen->backOffset = gDRIPriv->backOffset;
|
||||
i830Screen->depthOffset = gDRIPriv->depthOffset;
|
||||
i830Screen->backPitch = gDRIPriv->auxPitch;
|
||||
i830Screen->backPitchBits = gDRIPriv->auxPitchBits;
|
||||
i830Screen->textureOffset = gDRIPriv->textureOffset;
|
||||
i830Screen->textureSize = gDRIPriv->textureSize;
|
||||
i830Screen->logTextureGranularity = gDRIPriv->logTextureGranularity;
|
||||
|
||||
|
||||
i830Screen->bufs = i830_create_empty_buffers();
|
||||
if(i830Screen->bufs == NULL) {
|
||||
fprintf(stderr,"\nERROR: Failed to create empty buffers in %s \n",
|
||||
__FUNCTION__);
|
||||
FREE(i830Screen);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* Check if you need to create a fake buffer */
|
||||
if(i830_check_copy(sPriv->fd) == 1) {
|
||||
i830_malloc_proxy_buf(i830Screen->bufs);
|
||||
i830Screen->use_copy_buf = 1;
|
||||
} else {
|
||||
i830Screen->use_copy_buf = 0;
|
||||
}
|
||||
|
||||
i830Screen->back.handle = gDRIPriv->backbuffer;
|
||||
i830Screen->back.size = gDRIPriv->backbufferSize;
|
||||
|
||||
if (drmMap(sPriv->fd,
|
||||
i830Screen->back.handle,
|
||||
i830Screen->back.size,
|
||||
(drmAddress *)&i830Screen->back.map) != 0) {
|
||||
fprintf(stderr, "\nERROR: line %d, Function %s, File %s\n",
|
||||
__LINE__, __FUNCTION__, __FILE__);
|
||||
FREE(i830Screen);
|
||||
sPriv->private = NULL;
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
i830Screen->depth.handle = gDRIPriv->depthbuffer;
|
||||
i830Screen->depth.size = gDRIPriv->depthbufferSize;
|
||||
|
||||
if (drmMap(sPriv->fd,
|
||||
i830Screen->depth.handle,
|
||||
i830Screen->depth.size,
|
||||
(drmAddress *)&i830Screen->depth.map) != 0) {
|
||||
fprintf(stderr, "\nERROR: line %d, Function %s, File %s\n",
|
||||
__LINE__, __FUNCTION__, __FILE__);
|
||||
FREE(i830Screen);
|
||||
drmUnmap(i830Screen->back.map, i830Screen->back.size);
|
||||
sPriv->private = NULL;
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
i830Screen->tex.handle = gDRIPriv->textures;
|
||||
i830Screen->tex.size = gDRIPriv->textureSize;
|
||||
|
||||
if (drmMap(sPriv->fd,
|
||||
i830Screen->tex.handle,
|
||||
i830Screen->tex.size,
|
||||
(drmAddress *)&i830Screen->tex.map) != 0) {
|
||||
fprintf(stderr, "\nERROR: line %d, Function %s, File %s\n",
|
||||
__LINE__, __FUNCTION__, __FILE__);
|
||||
FREE(i830Screen);
|
||||
drmUnmap(i830Screen->back.map, i830Screen->back.size);
|
||||
drmUnmap(i830Screen->depth.map, i830Screen->depth.size);
|
||||
sPriv->private = NULL;
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
i830Screen->sarea_priv_offset = gDRIPriv->sarea_priv_offset;
|
||||
|
||||
if (0) i830PrintDRIInfo(i830Screen, sPriv, gDRIPriv);
|
||||
|
||||
i830Screen->drmMinor = sPriv->drmMinor;
|
||||
|
||||
if (sPriv->drmMinor >= 3) {
|
||||
int ret;
|
||||
drmI830GetParam gp;
|
||||
|
||||
gp.param = I830_PARAM_IRQ_ACTIVE;
|
||||
gp.value = &i830Screen->irq_active;
|
||||
|
||||
ret = drmCommandWriteRead( sPriv->fd, DRM_I830_GETPARAM,
|
||||
&gp, sizeof(gp));
|
||||
if (ret) {
|
||||
fprintf(stderr, "drmI830GetParam: %d\n", ret);
|
||||
return GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (sPriv->drmMinor >= 3) {
|
||||
int ret;
|
||||
drmI830SetParam sp;
|
||||
|
||||
sp.param = I830_SETPARAM_PERF_BOXES;
|
||||
sp.value = (getenv("I830_DO_BOXES") != 0);
|
||||
|
||||
ret = drmCommandWrite( sPriv->fd, DRM_I830_SETPARAM,
|
||||
&sp, sizeof(sp));
|
||||
if (ret)
|
||||
fprintf(stderr, "Couldn't set perfboxes: %d\n", ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( glx_enable_extension != NULL ) {
|
||||
(*glx_enable_extension)( psc, "GLX_SGI_make_current_read" );
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static void i830DestroyScreen(__DRIscreenPrivate *sPriv)
|
||||
{
|
||||
i830ScreenPrivate *i830Screen = (i830ScreenPrivate *)sPriv->private;
|
||||
|
||||
/* Need to unmap all the bufs and maps here:
|
||||
*/
|
||||
drmUnmap(i830Screen->back.map, i830Screen->back.size);
|
||||
drmUnmap(i830Screen->depth.map, i830Screen->depth.size);
|
||||
drmUnmap(i830Screen->tex.map, i830Screen->tex.size);
|
||||
FREE(i830Screen);
|
||||
sPriv->private = NULL;
|
||||
}
|
||||
|
||||
|
||||
static GLboolean i830CreateBuffer(__DRIscreenPrivate *driScrnPriv,
|
||||
__DRIdrawablePrivate *driDrawPriv,
|
||||
const __GLcontextModes *mesaVis,
|
||||
GLboolean isPixmap )
|
||||
{
|
||||
i830ScreenPrivate *screen = (i830ScreenPrivate *) driScrnPriv->private;
|
||||
|
||||
if (isPixmap) {
|
||||
return GL_FALSE; /* not implemented */
|
||||
}
|
||||
else {
|
||||
#if 0
|
||||
GLboolean swStencil = (mesaVis->stencilBits > 0 &&
|
||||
mesaVis->depthBits != 24);
|
||||
#else
|
||||
GLboolean swStencil = mesaVis->stencilBits > 0;
|
||||
#endif
|
||||
|
||||
struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis);
|
||||
|
||||
{
|
||||
driRenderbuffer *frontRb
|
||||
= driNewRenderbuffer(GL_RGBA, NULL, screen->cpp,
|
||||
/*screen->frontOffset*/0, screen->backPitch,
|
||||
driDrawPriv);
|
||||
i830SetSpanFunctions(frontRb, mesaVis);
|
||||
_mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base);
|
||||
}
|
||||
|
||||
if (mesaVis->doubleBufferMode) {
|
||||
driRenderbuffer *backRb
|
||||
= driNewRenderbuffer(GL_RGBA, NULL, screen->cpp,
|
||||
screen->backOffset, screen->backPitch,
|
||||
driDrawPriv);
|
||||
i830SetSpanFunctions(backRb, mesaVis);
|
||||
_mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base);
|
||||
}
|
||||
|
||||
if (mesaVis->depthBits == 16) {
|
||||
driRenderbuffer *depthRb
|
||||
= driNewRenderbuffer(GL_DEPTH_COMPONENT16, NULL, screen->cpp,
|
||||
screen->depthOffset, screen->backPitch,
|
||||
driDrawPriv);
|
||||
i830SetSpanFunctions(depthRb, mesaVis);
|
||||
_mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
|
||||
}
|
||||
else if (mesaVis->depthBits == 24) {
|
||||
if (mesaVis->stencilBits == 8) {
|
||||
driRenderbuffer *depthRb
|
||||
= driNewRenderbuffer(GL_DEPTH_COMPONENT24, NULL, screen->cpp,
|
||||
screen->depthOffset, screen->backPitch,
|
||||
driDrawPriv);
|
||||
i830SetSpanFunctions(depthRb, mesaVis);
|
||||
_mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
|
||||
}
|
||||
else {
|
||||
/* not really 32-bit Z, but use GL_DEPTH_COMPONENT32 anyway */
|
||||
driRenderbuffer *depthRb
|
||||
= driNewRenderbuffer(GL_DEPTH_COMPONENT32, NULL, screen->cpp,
|
||||
screen->depthOffset, screen->backPitch,
|
||||
driDrawPriv);
|
||||
i830SetSpanFunctions(depthRb, mesaVis);
|
||||
_mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
|
||||
}
|
||||
}
|
||||
|
||||
if (mesaVis->stencilBits > 0 && !swStencil) {
|
||||
driRenderbuffer *stencilRb
|
||||
= driNewRenderbuffer(GL_STENCIL_INDEX8_EXT, NULL, screen->cpp,
|
||||
screen->depthOffset, screen->backPitch,
|
||||
driDrawPriv);
|
||||
i830SetSpanFunctions(stencilRb, mesaVis);
|
||||
_mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base);
|
||||
}
|
||||
|
||||
_mesa_add_soft_renderbuffers(fb,
|
||||
GL_FALSE, /* color */
|
||||
GL_FALSE, /* depth */
|
||||
swStencil,
|
||||
mesaVis->accumRedBits > 0,
|
||||
GL_FALSE, /* alpha */
|
||||
GL_FALSE /* aux */);
|
||||
driDrawPriv->driverPrivate = (void *) fb;
|
||||
|
||||
return (driDrawPriv->driverPrivate != NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void i830DestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
|
||||
{
|
||||
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate));
|
||||
}
|
||||
|
||||
static const struct __DriverAPIRec i830API = {
|
||||
.InitDriver = i830InitDriver,
|
||||
.DestroyScreen = i830DestroyScreen,
|
||||
.CreateContext = i830CreateContext,
|
||||
.DestroyContext = i830DestroyContext,
|
||||
.CreateBuffer = i830CreateBuffer,
|
||||
.DestroyBuffer = i830DestroyBuffer,
|
||||
.SwapBuffers = i830SwapBuffers,
|
||||
.MakeCurrent = i830MakeCurrent,
|
||||
.UnbindContext = i830UnbindContext,
|
||||
.GetSwapInfo = NULL,
|
||||
.GetMSC = NULL,
|
||||
.WaitForMSC = NULL,
|
||||
.WaitForSBC = NULL,
|
||||
.SwapBuffersMSC = NULL
|
||||
};
|
||||
|
||||
|
||||
static __GLcontextModes *
|
||||
i830FillInModes( unsigned pixel_bits, unsigned depth_bits,
|
||||
unsigned stencil_bits, GLboolean have_back_buffer )
|
||||
{
|
||||
__GLcontextModes * modes;
|
||||
__GLcontextModes * m;
|
||||
unsigned num_modes;
|
||||
unsigned depth_buffer_factor;
|
||||
unsigned back_buffer_factor;
|
||||
GLenum fb_format;
|
||||
GLenum fb_type;
|
||||
|
||||
/* GLX_SWAP_COPY_OML is only supported because the MGA driver doesn't
|
||||
* support pageflipping at all.
|
||||
*/
|
||||
static const GLenum back_buffer_modes[] = {
|
||||
GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
|
||||
};
|
||||
|
||||
u_int8_t depth_bits_array[2];
|
||||
u_int8_t stencil_bits_array[2];
|
||||
|
||||
|
||||
depth_bits_array[0] = 0;
|
||||
depth_bits_array[1] = depth_bits;
|
||||
|
||||
/* Just like with the accumulation buffer, always provide some modes
|
||||
* with a stencil buffer. It will be a sw fallback, but some apps won't
|
||||
* care about that.
|
||||
*/
|
||||
stencil_bits_array[0] = 0;
|
||||
stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
|
||||
|
||||
depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1;
|
||||
back_buffer_factor = (have_back_buffer) ? 3 : 1;
|
||||
|
||||
num_modes = depth_buffer_factor * back_buffer_factor * 4;
|
||||
|
||||
if ( pixel_bits == 16 ) {
|
||||
fb_format = GL_RGB;
|
||||
fb_type = GL_UNSIGNED_SHORT_5_6_5;
|
||||
}
|
||||
else {
|
||||
fb_format = GL_BGRA;
|
||||
fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
||||
}
|
||||
|
||||
modes = (*dri_interface->createContextModes)( num_modes, sizeof( __GLcontextModes ) );
|
||||
m = modes;
|
||||
if ( ! driFillInModes( & m, fb_format, fb_type,
|
||||
depth_bits_array, stencil_bits_array, depth_buffer_factor,
|
||||
back_buffer_modes, back_buffer_factor,
|
||||
GLX_TRUE_COLOR ) ) {
|
||||
fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",
|
||||
__func__, __LINE__ );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* There's no direct color modes on i830? */
|
||||
|
||||
/* Mark the visual as slow if there are "fake" stencil bits.
|
||||
*/
|
||||
for ( m = modes ; m != NULL ; m = m->next ) {
|
||||
if ( (m->stencilBits != 0) && (m->stencilBits != stencil_bits) ) {
|
||||
m->visualRating = GLX_SLOW_CONFIG;
|
||||
}
|
||||
}
|
||||
|
||||
return modes;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is the bootstrap function for the driver. libGL supplies all of the
|
||||
* requisite information about the system, and the driver initializes itself.
|
||||
* This routine also fills in the linked list pointed to by \c driver_modes
|
||||
* with the \c __GLcontextModes that the driver can support for windows or
|
||||
* pbuffers.
|
||||
*
|
||||
* \return A pointer to a \c __DRIscreenPrivate on success, or \c NULL on
|
||||
* failure.
|
||||
*/
|
||||
PUBLIC
|
||||
void * __driCreateNewScreen_20050727( __DRInativeDisplay *dpy, int scrn, __DRIscreen *psc,
|
||||
const __GLcontextModes * modes,
|
||||
const __DRIversion * ddx_version,
|
||||
const __DRIversion * dri_version,
|
||||
const __DRIversion * drm_version,
|
||||
const __DRIframebuffer * frame_buffer,
|
||||
drmAddress pSAREA, int fd,
|
||||
int internal_api_version,
|
||||
const __DRIinterfaceMethods * interface,
|
||||
__GLcontextModes ** driver_modes )
|
||||
|
||||
{
|
||||
__DRIscreenPrivate *psp;
|
||||
static const __DRIversion ddx_expected = { 1, 0, 0 };
|
||||
static const __DRIversion dri_expected = { 4, 0, 0 };
|
||||
static const __DRIversion drm_expected = { 1, 3, 0 };
|
||||
|
||||
dri_interface = interface;
|
||||
|
||||
if ( ! driCheckDriDdxDrmVersions2( "i830",
|
||||
dri_version, & dri_expected,
|
||||
ddx_version, & ddx_expected,
|
||||
drm_version, & drm_expected ) ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL,
|
||||
ddx_version, dri_version, drm_version,
|
||||
frame_buffer, pSAREA, fd,
|
||||
internal_api_version, &i830API);
|
||||
if ( psp != NULL ) {
|
||||
I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv;
|
||||
*driver_modes = i830FillInModes( dri_priv->cpp * 8,
|
||||
(dri_priv->cpp == 2) ? 16 : 24,
|
||||
(dri_priv->cpp == 2) ? 0 : 8,
|
||||
(dri_priv->backOffset != dri_priv->depthOffset) );
|
||||
|
||||
/* Calling driInitExtensions here, with a NULL context pointer, does not actually
|
||||
* enable the extensions. It just makes sure that all the dispatch offsets for all
|
||||
* the extensions that *might* be enables are known. This is needed because the
|
||||
* dispatch offsets need to be known when _mesa_context_create is called, but we can't
|
||||
* enable the extensions until we have a context pointer.
|
||||
*
|
||||
* Hello chicken. Hello egg. How are you two today?
|
||||
*/
|
||||
driInitExtensions( NULL, card_extensions, GL_FALSE );
|
||||
}
|
||||
|
||||
return (void *) psp;
|
||||
}
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sub license, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the
|
||||
next paragraph) shall be included in all copies or substantial portions
|
||||
of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/*
|
||||
* Authors:
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
* Adapted for use on the I830M:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*/
|
||||
|
||||
#ifndef _I830_INIT_H_
|
||||
#define _I830_INIT_H_
|
||||
|
||||
#include <sys/time.h>
|
||||
#include "dri_util.h"
|
||||
#include "xmlconfig.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
drm_handle_t handle;
|
||||
drmSize size;
|
||||
char *map;
|
||||
} i830Region, *i830RegionPtr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
||||
i830Region front;
|
||||
i830Region back;
|
||||
i830Region depth;
|
||||
i830Region tex;
|
||||
|
||||
int deviceID;
|
||||
int width;
|
||||
int height;
|
||||
int mem;
|
||||
|
||||
int cpp; /* for front and back buffers */
|
||||
int bitsPerPixel;
|
||||
|
||||
int fbFormat;
|
||||
int fbOffset;
|
||||
int fbStride;
|
||||
|
||||
int backOffset;
|
||||
int depthOffset;
|
||||
|
||||
int backPitch;
|
||||
int backPitchBits;
|
||||
|
||||
int textureOffset;
|
||||
int textureSize;
|
||||
int logTextureGranularity;
|
||||
|
||||
__DRIscreenPrivate *driScrnPriv;
|
||||
drmBufMapPtr bufs;
|
||||
int use_copy_buf;
|
||||
unsigned int sarea_priv_offset;
|
||||
|
||||
int drmMinor;
|
||||
int irq_active;
|
||||
|
||||
/**
|
||||
* Configuration cache with default values for all contexts
|
||||
*/
|
||||
driOptionCache optionCache;
|
||||
}i830ScreenPrivate;
|
||||
|
||||
|
||||
extern GLboolean
|
||||
i830CreateContext( const __GLcontextModes *mesaVis,
|
||||
__DRIcontextPrivate *driContextPriv,
|
||||
void *sharedContextPrivate );
|
||||
|
||||
extern void
|
||||
i830DestroyContext(__DRIcontextPrivate *driContextPriv);
|
||||
|
||||
extern GLboolean
|
||||
i830UnbindContext(__DRIcontextPrivate *driContextPriv);
|
||||
|
||||
extern GLboolean
|
||||
i830MakeCurrent(__DRIcontextPrivate *driContextPriv,
|
||||
__DRIdrawablePrivate *driDrawPriv,
|
||||
__DRIdrawablePrivate *driReadPriv);
|
||||
|
||||
extern void
|
||||
i830SwapBuffers(__DRIdrawablePrivate *driDrawPriv);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,318 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 2001 VA Linux Systems Inc., Fremont, California.
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_span.c,v 1.4 2002/12/10 01:26:53 dawes Exp $ */
|
||||
|
||||
/**
|
||||
* \file i830_span.c
|
||||
*
|
||||
* Heavily based on the I810 driver, which was written by Keith Whitwell.
|
||||
*
|
||||
* \author Jeff Hartmann <jhartmann@2d3d.com>
|
||||
* \author Keith Whitwell <keith@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#include "glheader.h"
|
||||
#include "macros.h"
|
||||
#include "mtypes.h"
|
||||
#include "colormac.h"
|
||||
|
||||
#include "i830_screen.h"
|
||||
#include "i830_dri.h"
|
||||
|
||||
#include "i830_span.h"
|
||||
#include "i830_ioctl.h"
|
||||
#include "swrast/swrast.h"
|
||||
|
||||
|
||||
#define DBG 0
|
||||
|
||||
#define LOCAL_VARS \
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx); \
|
||||
__DRIdrawablePrivate *dPriv = imesa->mesa_drawable; \
|
||||
i830ScreenPrivate *i830Screen = imesa->i830Screen; \
|
||||
GLuint pitch = i830Screen->backPitch * i830Screen->cpp; \
|
||||
GLuint height = dPriv->h; \
|
||||
char *buf = (char *)(imesa->drawMap + \
|
||||
dPriv->x * i830Screen->cpp + \
|
||||
dPriv->y * pitch); \
|
||||
char *read_buf = (char *)(imesa->readMap + \
|
||||
dPriv->x * i830Screen->cpp + \
|
||||
dPriv->y * pitch); \
|
||||
GLushort p; \
|
||||
(void) read_buf; (void) buf; (void) p
|
||||
|
||||
#define LOCAL_DEPTH_VARS \
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx); \
|
||||
__DRIdrawablePrivate *dPriv = imesa->mesa_drawable; \
|
||||
i830ScreenPrivate *i830Screen = imesa->i830Screen; \
|
||||
GLuint pitch = i830Screen->backPitch * i830Screen->cpp; \
|
||||
GLuint height = dPriv->h; \
|
||||
char *buf = (char *)(i830Screen->depth.map + \
|
||||
dPriv->x * i830Screen->cpp + \
|
||||
dPriv->y * pitch)
|
||||
|
||||
#define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS
|
||||
|
||||
#define INIT_MONO_PIXEL(p,color)\
|
||||
p = PACK_COLOR_565(color[0],color[1],color[2])
|
||||
|
||||
#define Y_FLIP(_y) (height - _y - 1)
|
||||
|
||||
#define HW_LOCK()
|
||||
|
||||
#define HW_UNLOCK()
|
||||
|
||||
/* 16 bit, 565 rgb color spanline and pixel functions
|
||||
*/
|
||||
#define WRITE_RGBA( _x, _y, r, g, b, a ) \
|
||||
*(GLushort *)(buf + _x*2 + _y*pitch) = ( (((int)r & 0xf8) << 8) | \
|
||||
(((int)g & 0xfc) << 3) | \
|
||||
(((int)b & 0xf8) >> 3))
|
||||
#define WRITE_PIXEL( _x, _y, p ) \
|
||||
*(GLushort *)(buf + _x*2 + _y*pitch) = p
|
||||
|
||||
#define READ_RGBA( rgba, _x, _y ) \
|
||||
do { \
|
||||
GLushort p = *(GLushort *)(read_buf + _x*2 + _y*pitch); \
|
||||
rgba[0] = (((p >> 11) & 0x1f) * 255) / 31; \
|
||||
rgba[1] = (((p >> 5) & 0x3f) * 255) / 63; \
|
||||
rgba[2] = (((p >> 0) & 0x1f) * 255) / 31; \
|
||||
rgba[3] = 255; \
|
||||
} while(0)
|
||||
|
||||
#define TAG(x) i830##x##_565
|
||||
#include "spantmp.h"
|
||||
|
||||
/* 15 bit, 555 rgb color spanline and pixel functions
|
||||
*/
|
||||
#define WRITE_RGBA( _x, _y, r, g, b, a ) \
|
||||
*(GLushort *)(buf + _x*2 + _y*pitch) = (((r & 0xf8) << 7) | \
|
||||
((g & 0xf8) << 3) | \
|
||||
((b & 0xf8) >> 3))
|
||||
|
||||
#define WRITE_PIXEL( _x, _y, p ) \
|
||||
*(GLushort *)(buf + _x*2 + _y*pitch) = p
|
||||
|
||||
#define READ_RGBA( rgba, _x, _y ) \
|
||||
do { \
|
||||
GLushort p = *(GLushort *)(read_buf + _x*2 + _y*pitch); \
|
||||
rgba[0] = (p >> 7) & 0xf8; \
|
||||
rgba[1] = (p >> 3) & 0xf8; \
|
||||
rgba[2] = (p << 3) & 0xf8; \
|
||||
rgba[3] = 255; \
|
||||
} while(0)
|
||||
|
||||
#define TAG(x) i830##x##_555
|
||||
#include "spantmp.h"
|
||||
|
||||
/* 16 bit depthbuffer functions.
|
||||
*/
|
||||
#define WRITE_DEPTH( _x, _y, d ) \
|
||||
*(GLushort *)(buf + _x*2 + _y*pitch) = d;
|
||||
|
||||
#define READ_DEPTH( d, _x, _y ) \
|
||||
d = *(GLushort *)(buf + _x*2 + _y*pitch);
|
||||
|
||||
|
||||
#define TAG(x) i830##x##_z16
|
||||
#include "depthtmp.h"
|
||||
|
||||
|
||||
#undef LOCAL_VARS
|
||||
#define LOCAL_VARS \
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx); \
|
||||
__DRIdrawablePrivate *dPriv = imesa->driDrawable; \
|
||||
i830ScreenPrivate *i830Screen = imesa->i830Screen; \
|
||||
GLuint pitch = i830Screen->backPitch * i830Screen->cpp; \
|
||||
GLuint height = dPriv->h; \
|
||||
char *buf = (char *)(imesa->drawMap + \
|
||||
dPriv->x * i830Screen->cpp + \
|
||||
dPriv->y * pitch); \
|
||||
char *read_buf = (char *)(imesa->readMap + \
|
||||
dPriv->x * i830Screen->cpp + \
|
||||
dPriv->y * pitch); \
|
||||
GLuint p = I830_CONTEXT( ctx )->MonoColor; \
|
||||
(void) read_buf; (void) buf; (void) p
|
||||
|
||||
#undef INIT_MONO_PIXEL
|
||||
#define INIT_MONO_PIXEL(p,color)\
|
||||
p = PACK_COLOR_888(color[0],color[1],color[2])
|
||||
|
||||
/* 32 bit, 8888 argb color spanline and pixel functions
|
||||
*/
|
||||
#define WRITE_RGBA(_x, _y, r, g, b, a) \
|
||||
*(GLuint *)(buf + _x*4 + _y*pitch) = ((r << 16) | \
|
||||
(g << 8) | \
|
||||
(b << 0) | \
|
||||
(a << 24) )
|
||||
|
||||
#define WRITE_PIXEL(_x, _y, p) \
|
||||
*(GLuint *)(buf + _x*4 + _y*pitch) = p
|
||||
|
||||
|
||||
#define READ_RGBA(rgba, _x, _y) \
|
||||
do { \
|
||||
GLuint p = *(GLuint *)(read_buf + _x*4 + _y*pitch); \
|
||||
rgba[0] = (p >> 16) & 0xff; \
|
||||
rgba[1] = (p >> 8) & 0xff; \
|
||||
rgba[2] = (p >> 0) & 0xff; \
|
||||
rgba[3] = (p >> 24) & 0xff; \
|
||||
} while (0)
|
||||
|
||||
#define TAG(x) i830##x##_8888
|
||||
#include "spantmp.h"
|
||||
|
||||
/* 24 bit depthbuffer functions.
|
||||
*/
|
||||
#define WRITE_DEPTH( _x, _y, d ) \
|
||||
*(GLuint *)(buf + _x*4 + _y*pitch) = 0xffffff & d;
|
||||
|
||||
#define READ_DEPTH( d, _x, _y ) \
|
||||
d = *(GLuint *)(buf + _x*4 + _y*pitch) & 0xffffff;
|
||||
|
||||
#define TAG(x) i830##x##_z24
|
||||
#include "depthtmp.h"
|
||||
|
||||
/* 24/8 bit interleaved depth/stencil functions
|
||||
*/
|
||||
#define WRITE_DEPTH( _x, _y, d ) { \
|
||||
GLuint tmp = *(GLuint *)(buf + _x*4 + _y*pitch); \
|
||||
tmp &= 0xff000000; \
|
||||
tmp |= (d) & 0xffffff; \
|
||||
*(GLuint *)(buf + _x*4 + _y*pitch) = tmp; \
|
||||
}
|
||||
|
||||
#define READ_DEPTH( d, _x, _y ) \
|
||||
d = *(GLuint *)(buf + _x*4 + _y*pitch) & 0xffffff;
|
||||
|
||||
|
||||
#define TAG(x) i830##x##_z24_s8
|
||||
#include "depthtmp.h"
|
||||
|
||||
#define WRITE_STENCIL( _x, _y, d ) { \
|
||||
GLuint tmp = *(GLuint *)(buf + _x*4 + _y*pitch); \
|
||||
tmp &= 0xffffff; \
|
||||
tmp |= (d<<24); \
|
||||
*(GLuint *)(buf + _x*4 + _y*pitch) = tmp; \
|
||||
}
|
||||
|
||||
#define READ_STENCIL( d, _x, _y ) \
|
||||
d = *(GLuint *)(buf + _x*4 + _y*pitch) >> 24;
|
||||
|
||||
#define TAG(x) i830##x##_z24_s8
|
||||
#include "stenciltmp.h"
|
||||
|
||||
/*
|
||||
* This function is called to specify which buffer to read and write
|
||||
* for software rasterization (swrast) fallbacks. This doesn't necessarily
|
||||
* correspond to glDrawBuffer() or glReadBuffer() calls.
|
||||
*/
|
||||
#if 000
|
||||
static void i830SetBuffer(GLcontext *ctx, GLframebuffer *colorBuffer,
|
||||
GLuint bufferBit)
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
|
||||
assert( (colorBuffer == imesa->driDrawable->driverPrivate)
|
||||
|| (colorBuffer == imesa->driReadable->driverPrivate) );
|
||||
|
||||
imesa->mesa_drawable = (colorBuffer == imesa->driDrawable->driverPrivate)
|
||||
? imesa->driDrawable : imesa->driReadable;
|
||||
|
||||
if (bufferBit == BUFFER_BIT_FRONT_LEFT) {
|
||||
imesa->drawMap = (char *)imesa->driScreen->pFB;
|
||||
imesa->readMap = (char *)imesa->driScreen->pFB;
|
||||
} else if (bufferBit == BUFFER_BIT_BACK_LEFT) {
|
||||
imesa->drawMap = imesa->i830Screen->back.map;
|
||||
imesa->readMap = imesa->i830Screen->back.map;
|
||||
} else {
|
||||
ASSERT(0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Move locking out to get reasonable span performance.
|
||||
*/
|
||||
void i830SpanRenderStart( GLcontext *ctx )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
I830_FIREVERTICES(imesa);
|
||||
LOCK_HARDWARE(imesa);
|
||||
i830RegetLockQuiescent( imesa );
|
||||
}
|
||||
|
||||
void i830SpanRenderFinish( GLcontext *ctx )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT( ctx );
|
||||
_swrast_flush( ctx );
|
||||
UNLOCK_HARDWARE( imesa );
|
||||
}
|
||||
|
||||
void i830DDInitSpanFuncs( GLcontext *ctx )
|
||||
{
|
||||
struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference(ctx);
|
||||
swdd->SpanRenderStart = i830SpanRenderStart;
|
||||
swdd->SpanRenderFinish = i830SpanRenderFinish;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Plug in the Get/Put routines for the given driRenderbuffer.
|
||||
*/
|
||||
void
|
||||
i830SetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis)
|
||||
{
|
||||
if (drb->Base.InternalFormat == GL_RGBA) {
|
||||
if (vis->redBits == 5 && vis->greenBits == 5 && vis->blueBits == 5) {
|
||||
i830InitPointers_555(&drb->Base);
|
||||
}
|
||||
else if (vis->redBits == 5 && vis->greenBits == 6 && vis->blueBits == 5) {
|
||||
i830InitPointers_565(&drb->Base);
|
||||
}
|
||||
else {
|
||||
assert(vis->redBits == 8);
|
||||
assert(vis->greenBits == 8);
|
||||
assert(vis->blueBits == 8);
|
||||
i830InitPointers_8888(&drb->Base);
|
||||
}
|
||||
}
|
||||
else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT16) {
|
||||
i830InitDepthPointers_z16(&drb->Base);
|
||||
}
|
||||
else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT24) {
|
||||
i830InitDepthPointers_z24_s8(&drb->Base);
|
||||
}
|
||||
else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT32) {
|
||||
/* not _really_ 32-bit Z */
|
||||
i830InitDepthPointers_z24(&drb->Base);
|
||||
}
|
||||
else if (drb->Base.InternalFormat == GL_STENCIL_INDEX8_EXT) {
|
||||
i830InitStencilPointers_z24_s8(&drb->Base);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 2001 VA Linux Systems Inc., Fremont, California.
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_span.h,v 1.2 2002/09/11 00:29:26 dawes Exp $ */
|
||||
|
||||
/*
|
||||
* Author:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*
|
||||
* Heavily based on the I810 driver, which was written by:
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#ifndef _I830_SPAN_H
|
||||
#define _I830_SPAN_H
|
||||
|
||||
#include "drirenderbuffer.h"
|
||||
|
||||
extern void i830DDInitSpanFuncs( GLcontext *ctx );
|
||||
|
||||
extern void i830SpanRenderFinish( GLcontext *ctx );
|
||||
extern void i830SpanRenderStart( GLcontext *ctx );
|
||||
|
||||
extern void
|
||||
i830SetSpanFunctions(driRenderbuffer *rb, const GLvisual *vis);
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,68 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 2001 VA Linux Systems Inc., Fremont, California.
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_state.h,v 1.3 2002/12/10 01:26:53 dawes Exp $ */
|
||||
|
||||
/*
|
||||
* Author:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*
|
||||
* Heavily based on the I810 driver, which was written by:
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
*/
|
||||
#ifndef _I830_STATE_H
|
||||
#define _I830_STATE_H
|
||||
|
||||
#include "i830_context.h"
|
||||
#include "colormac.h"
|
||||
#define FloatToInt(F) ((int)(F))
|
||||
|
||||
/*
|
||||
* * This function/macro is sensitive to precision. Test carefully
|
||||
* * if you change it.
|
||||
* */
|
||||
#define FLOAT_COLOR_TO_UBYTE_COLOR(b, f) \
|
||||
do { \
|
||||
union {GLfloat r; GLuint i; } tmp; \
|
||||
tmp.r = f; \
|
||||
b = ((tmp.i >= IEEE_ONE) \
|
||||
? ((GLint)tmp.i < 0) ? (GLubyte)0 : (GLubyte)255 \
|
||||
: (tmp.r = tmp.r*(255.0F/256.0F) + 32768.0F, \
|
||||
(GLubyte)tmp.i)); \
|
||||
} while (0)
|
||||
|
||||
|
||||
|
||||
extern void i830DDInitState( GLcontext *ctx );
|
||||
extern void i830DDInitStateFuncs( GLcontext *ctx );
|
||||
|
||||
extern void i830PrintDirty( const char *msg, GLuint state );
|
||||
extern void i830SetDrawBuffer(GLcontext *ctx, GLenum mode );
|
||||
|
||||
extern void i830Fallback( i830ContextPtr imesa, GLuint bit, GLboolean mode );
|
||||
#define FALLBACK( imesa, bit, mode ) i830Fallback( imesa, bit, mode )
|
||||
#endif
|
||||
|
|
@ -1,700 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 2001 2d3d Inc., Delray Beach, FL
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_tex.c,v 1.5 2003/05/07 21:56:31 dawes Exp $ */
|
||||
|
||||
/*
|
||||
* Author:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*
|
||||
* Heavily based on the I810 driver, which was written by:
|
||||
* Keith Whitwell <keithw@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#include "glheader.h"
|
||||
#include "mtypes.h"
|
||||
#include "imports.h"
|
||||
#include "simple_list.h"
|
||||
#include "enums.h"
|
||||
#include "texstore.h"
|
||||
#include "teximage.h"
|
||||
#include "texformat.h"
|
||||
#include "texmem.h"
|
||||
#include "texobj.h"
|
||||
#include "swrast/swrast.h"
|
||||
#include "texobj.h"
|
||||
#include "mm.h"
|
||||
|
||||
#include "i830_screen.h"
|
||||
#include "i830_dri.h"
|
||||
#include "i830_context.h"
|
||||
#include "i830_tex.h"
|
||||
#include "i830_state.h"
|
||||
#include "i830_ioctl.h"
|
||||
|
||||
/*
|
||||
* Compute the 'S2.4' lod bias factor from the floating point OpenGL bias.
|
||||
*/
|
||||
static void i830ComputeLodBias( i830ContextPtr imesa, unsigned unit,
|
||||
GLfloat bias )
|
||||
{
|
||||
int b;
|
||||
|
||||
b = (int) (bias * 16.0);
|
||||
if(b > 63) b = 63;
|
||||
else if (b < -64) b = -64;
|
||||
imesa->LodBias[ unit ] = ((b << TM0S3_LOD_BIAS_SHIFT) &
|
||||
TM0S3_LOD_BIAS_MASK);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the texture wrap modes.
|
||||
*
|
||||
* The i830M (and related graphics cores) do not support GL_CLAMP. The Intel
|
||||
* drivers for "other operating systems" implement GL_CLAMP as
|
||||
* GL_CLAMP_TO_EDGE, so the same is done here.
|
||||
*
|
||||
* \param t Texture object whose wrap modes are to be set
|
||||
* \param swrap Wrap mode for the \a s texture coordinate
|
||||
* \param twrap Wrap mode for the \a t texture coordinate
|
||||
*/
|
||||
|
||||
static void i830SetTexWrapping(i830TextureObjectPtr tex,
|
||||
GLenum swrap, GLenum twrap)
|
||||
{
|
||||
tex->Setup[I830_TEXREG_MCS] &= ~(TEXCOORD_ADDR_U_MASK|TEXCOORD_ADDR_V_MASK);
|
||||
|
||||
switch( swrap ) {
|
||||
case GL_REPEAT:
|
||||
tex->Setup[I830_TEXREG_MCS] |= TEXCOORD_ADDR_U_MODE(TEXCOORDMODE_WRAP);
|
||||
break;
|
||||
case GL_CLAMP:
|
||||
case GL_CLAMP_TO_EDGE:
|
||||
tex->Setup[I830_TEXREG_MCS] |= TEXCOORD_ADDR_U_MODE(TEXCOORDMODE_CLAMP);
|
||||
break;
|
||||
case GL_CLAMP_TO_BORDER:
|
||||
tex->Setup[I830_TEXREG_MCS] |=
|
||||
TEXCOORD_ADDR_U_MODE(TEXCOORDMODE_CLAMP_BORDER);
|
||||
break;
|
||||
case GL_MIRRORED_REPEAT:
|
||||
tex->Setup[I830_TEXREG_MCS] |=
|
||||
TEXCOORD_ADDR_U_MODE(TEXCOORDMODE_MIRROR);
|
||||
break;
|
||||
default:
|
||||
_mesa_problem(NULL, "bad S wrap mode in %s", __FUNCTION__);
|
||||
}
|
||||
|
||||
switch( twrap ) {
|
||||
case GL_REPEAT:
|
||||
tex->Setup[I830_TEXREG_MCS] |= TEXCOORD_ADDR_V_MODE(TEXCOORDMODE_WRAP);
|
||||
break;
|
||||
case GL_CLAMP:
|
||||
case GL_CLAMP_TO_EDGE:
|
||||
tex->Setup[I830_TEXREG_MCS] |= TEXCOORD_ADDR_V_MODE(TEXCOORDMODE_CLAMP);
|
||||
break;
|
||||
case GL_CLAMP_TO_BORDER:
|
||||
tex->Setup[I830_TEXREG_MCS] |=
|
||||
TEXCOORD_ADDR_V_MODE(TEXCOORDMODE_CLAMP_BORDER);
|
||||
break;
|
||||
case GL_MIRRORED_REPEAT:
|
||||
tex->Setup[I830_TEXREG_MCS] |=
|
||||
TEXCOORD_ADDR_V_MODE(TEXCOORDMODE_MIRROR);
|
||||
break;
|
||||
default:
|
||||
_mesa_problem(NULL, "bad T wrap mode in %s", __FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
||||
static void i830SetTexMaxAnisotropy( i830TextureObjectPtr t, GLfloat max )
|
||||
{
|
||||
t->max_anisotropy = max;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the texture magnification and minification modes.
|
||||
*
|
||||
* \param t Texture whose filter modes are to be set
|
||||
* \param minf Texture minification mode
|
||||
* \param magf Texture magnification mode
|
||||
* \param bias LOD bias for this texture unit.
|
||||
*/
|
||||
|
||||
static void i830SetTexFilter( i830TextureObjectPtr t,
|
||||
GLenum minf, GLenum magf )
|
||||
{
|
||||
int minFilt = 0, mipFilt = 0, magFilt = 0;
|
||||
|
||||
if(I830_DEBUG&DEBUG_DRI)
|
||||
fprintf(stderr, "%s\n", __FUNCTION__);
|
||||
|
||||
if ( t->max_anisotropy > 1.0 ) {
|
||||
minFilt = FILTER_ANISOTROPIC;
|
||||
magFilt = FILTER_ANISOTROPIC;
|
||||
}
|
||||
else {
|
||||
switch (minf) {
|
||||
case GL_NEAREST:
|
||||
minFilt = FILTER_NEAREST;
|
||||
mipFilt = MIPFILTER_NONE;
|
||||
break;
|
||||
case GL_LINEAR:
|
||||
minFilt = FILTER_LINEAR;
|
||||
mipFilt = MIPFILTER_NONE;
|
||||
break;
|
||||
case GL_NEAREST_MIPMAP_NEAREST:
|
||||
minFilt = FILTER_NEAREST;
|
||||
mipFilt = MIPFILTER_NEAREST;
|
||||
break;
|
||||
case GL_LINEAR_MIPMAP_NEAREST:
|
||||
minFilt = FILTER_LINEAR;
|
||||
mipFilt = MIPFILTER_NEAREST;
|
||||
break;
|
||||
case GL_NEAREST_MIPMAP_LINEAR:
|
||||
minFilt = FILTER_NEAREST;
|
||||
mipFilt = MIPFILTER_LINEAR;
|
||||
break;
|
||||
case GL_LINEAR_MIPMAP_LINEAR:
|
||||
minFilt = FILTER_LINEAR;
|
||||
mipFilt = MIPFILTER_LINEAR;
|
||||
break;
|
||||
default:
|
||||
_mesa_problem(NULL, "%s: Unsupported min. filter %d", __FUNCTION__,
|
||||
(int) minf );
|
||||
break;
|
||||
}
|
||||
|
||||
switch (magf) {
|
||||
case GL_NEAREST:
|
||||
magFilt = FILTER_NEAREST;
|
||||
break;
|
||||
case GL_LINEAR:
|
||||
magFilt = FILTER_LINEAR;
|
||||
break;
|
||||
default:
|
||||
_mesa_problem(NULL, "%s: Unsupported mag. filter %d", __FUNCTION__,
|
||||
(int) magf );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_MIN_FILTER_MASK;
|
||||
t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_MIP_FILTER_MASK;
|
||||
t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_MAG_FILTER_MASK;
|
||||
t->Setup[I830_TEXREG_TM0S3] |= ((minFilt << TM0S3_MIN_FILTER_SHIFT) |
|
||||
(mipFilt << TM0S3_MIP_FILTER_SHIFT) |
|
||||
(magFilt << TM0S3_MAG_FILTER_SHIFT));
|
||||
}
|
||||
|
||||
static void i830SetTexBorderColor(i830TextureObjectPtr t, GLubyte color[4])
|
||||
{
|
||||
if(I830_DEBUG&DEBUG_DRI)
|
||||
fprintf(stderr, "%s\n", __FUNCTION__);
|
||||
|
||||
t->Setup[I830_TEXREG_TM0S4] =
|
||||
I830PACKCOLOR8888(color[0],color[1],color[2],color[3]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Allocate space for and load the mesa images into the texture memory block.
|
||||
* This will happen before drawing with a new texture, or drawing with a
|
||||
* texture after it was swapped out or teximaged again.
|
||||
*/
|
||||
|
||||
static i830TextureObjectPtr i830AllocTexObj( struct gl_texture_object *texObj )
|
||||
{
|
||||
i830TextureObjectPtr t;
|
||||
|
||||
t = CALLOC_STRUCT( i830_texture_object_t );
|
||||
texObj->DriverData = t;
|
||||
if ( t != NULL ) {
|
||||
/* Initialize non-image-dependent parts of the state:
|
||||
*/
|
||||
t->base.tObj = texObj;
|
||||
|
||||
t->Setup[I830_TEXREG_TM0LI] = STATE3D_LOAD_STATE_IMMEDIATE_2;
|
||||
t->Setup[I830_TEXREG_TM0S0] = TM0S0_USE_FENCE;
|
||||
t->Setup[I830_TEXREG_TM0S1] = 0;
|
||||
t->Setup[I830_TEXREG_TM0S2] = 0;
|
||||
t->Setup[I830_TEXREG_TM0S3] = 0;
|
||||
|
||||
t->Setup[I830_TEXREG_NOP0] = 0;
|
||||
t->Setup[I830_TEXREG_NOP1] = 0;
|
||||
t->Setup[I830_TEXREG_NOP2] = 0;
|
||||
|
||||
t->Setup[I830_TEXREG_MCS] = (STATE3D_MAP_COORD_SET_CMD |
|
||||
MAP_UNIT(0) |
|
||||
ENABLE_TEXCOORD_PARAMS |
|
||||
TEXCOORDS_ARE_NORMAL |
|
||||
TEXCOORDTYPE_CARTESIAN |
|
||||
ENABLE_ADDR_V_CNTL |
|
||||
TEXCOORD_ADDR_V_MODE(TEXCOORDMODE_WRAP) |
|
||||
ENABLE_ADDR_U_CNTL |
|
||||
TEXCOORD_ADDR_U_MODE(TEXCOORDMODE_WRAP));
|
||||
|
||||
make_empty_list( & t->base );
|
||||
|
||||
i830SetTexWrapping( t, texObj->WrapS, texObj->WrapT );
|
||||
i830SetTexMaxAnisotropy( t, texObj->MaxAnisotropy );
|
||||
i830SetTexFilter( t, texObj->MinFilter, texObj->MagFilter );
|
||||
i830SetTexBorderColor( t, texObj->_BorderChan );
|
||||
}
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
static void i830TexParameter( GLcontext *ctx, GLenum target,
|
||||
struct gl_texture_object *tObj,
|
||||
GLenum pname, const GLfloat *params )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
i830TextureObjectPtr t = (i830TextureObjectPtr) tObj->DriverData;
|
||||
GLuint unit = ctx->Texture.CurrentUnit;
|
||||
|
||||
if (!t)
|
||||
return;
|
||||
|
||||
if ( target != GL_TEXTURE_2D && target != GL_TEXTURE_RECTANGLE_NV )
|
||||
return;
|
||||
|
||||
/* Can't do the update now as we don't know whether to flush
|
||||
* vertices or not. Setting imesa->NewGLState means that
|
||||
* i830UpdateTextureState() will be called before any triangles are
|
||||
* rendered. If a statechange has occurred, it will be detected at
|
||||
* that point, and buffered vertices flushed.
|
||||
*/
|
||||
switch (pname) {
|
||||
case GL_TEXTURE_MIN_FILTER:
|
||||
case GL_TEXTURE_MAG_FILTER:
|
||||
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
|
||||
i830SetTexMaxAnisotropy( t, tObj->MaxAnisotropy );
|
||||
i830SetTexFilter( t, tObj->MinFilter, tObj->MagFilter );
|
||||
break;
|
||||
|
||||
case GL_TEXTURE_WRAP_S:
|
||||
case GL_TEXTURE_WRAP_T:
|
||||
i830SetTexWrapping( t, tObj->WrapS, tObj->WrapT );
|
||||
break;
|
||||
|
||||
case GL_TEXTURE_BORDER_COLOR:
|
||||
i830SetTexBorderColor( t, tObj->_BorderChan );
|
||||
break;
|
||||
|
||||
case GL_TEXTURE_BASE_LEVEL:
|
||||
case GL_TEXTURE_MAX_LEVEL:
|
||||
case GL_TEXTURE_MIN_LOD:
|
||||
case GL_TEXTURE_MAX_LOD:
|
||||
/* The i830 and its successors can do a lot of this without
|
||||
* reloading the textures. A project for someone?
|
||||
*/
|
||||
I830_FIREVERTICES( I830_CONTEXT(ctx) );
|
||||
driSwapOutTextureObject( (driTextureObject *) t );
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (t == imesa->CurrentTexObj[unit]) {
|
||||
I830_STATECHANGE( imesa, I830_UPLOAD_TEX0 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void i830TexEnv( GLcontext *ctx, GLenum target,
|
||||
GLenum pname, const GLfloat *param )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT( ctx );
|
||||
GLuint unit = ctx->Texture.CurrentUnit;
|
||||
|
||||
/* Only one env color. Need a fallback if env colors are different
|
||||
* and texture setup references env color in both units.
|
||||
*/
|
||||
switch (pname) {
|
||||
case GL_TEXTURE_ENV_COLOR:
|
||||
case GL_TEXTURE_ENV_MODE:
|
||||
case GL_COMBINE_RGB_EXT:
|
||||
case GL_COMBINE_ALPHA_EXT:
|
||||
case GL_SOURCE0_RGB_EXT:
|
||||
case GL_SOURCE1_RGB_EXT:
|
||||
case GL_SOURCE2_RGB_EXT:
|
||||
case GL_SOURCE0_ALPHA_EXT:
|
||||
case GL_SOURCE1_ALPHA_EXT:
|
||||
case GL_SOURCE2_ALPHA_EXT:
|
||||
case GL_OPERAND0_RGB_EXT:
|
||||
case GL_OPERAND1_RGB_EXT:
|
||||
case GL_OPERAND2_RGB_EXT:
|
||||
case GL_OPERAND0_ALPHA_EXT:
|
||||
case GL_OPERAND1_ALPHA_EXT:
|
||||
case GL_OPERAND2_ALPHA_EXT:
|
||||
case GL_RGB_SCALE_EXT:
|
||||
case GL_ALPHA_SCALE:
|
||||
imesa->TexEnvImageFmt[unit] = 0; /* force recalc of env state */
|
||||
break;
|
||||
|
||||
case GL_TEXTURE_LOD_BIAS_EXT:
|
||||
i830ComputeLodBias( imesa, unit, *param );
|
||||
I830_STATECHANGE( imesa, I830_UPLOAD_TEX_N(unit) );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void i830TexImage2D( GLcontext *ctx, GLenum target, GLint level,
|
||||
GLint internalFormat,
|
||||
GLint width, GLint height, GLint border,
|
||||
GLenum format, GLenum type, const GLvoid *pixels,
|
||||
const struct gl_pixelstore_attrib *packing,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage )
|
||||
{
|
||||
driTextureObject * t = (driTextureObject *) texObj->DriverData;
|
||||
if (t) {
|
||||
I830_FIREVERTICES( I830_CONTEXT(ctx) );
|
||||
driSwapOutTextureObject( t );
|
||||
}
|
||||
else {
|
||||
t = (driTextureObject *) i830AllocTexObj( texObj );
|
||||
if (!t) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
_mesa_store_teximage2d( ctx, target, level, internalFormat,
|
||||
width, height, border, format, type,
|
||||
pixels, packing, texObj, texImage );
|
||||
}
|
||||
|
||||
static void i830TexSubImage2D( GLcontext *ctx,
|
||||
GLenum target,
|
||||
GLint level,
|
||||
GLint xoffset, GLint yoffset,
|
||||
GLsizei width, GLsizei height,
|
||||
GLenum format, GLenum type,
|
||||
const GLvoid *pixels,
|
||||
const struct gl_pixelstore_attrib *packing,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage )
|
||||
{
|
||||
driTextureObject * t = (driTextureObject *) texObj->DriverData;
|
||||
if (t) {
|
||||
I830_FIREVERTICES( I830_CONTEXT(ctx) );
|
||||
driSwapOutTextureObject( t );
|
||||
}
|
||||
_mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width,
|
||||
height, format, type, pixels, packing, texObj,
|
||||
texImage);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void i830CompressedTexImage2D( GLcontext *ctx, GLenum target, GLint level,
|
||||
GLint internalFormat,
|
||||
GLint width, GLint height, GLint border,
|
||||
GLsizei imageSize, const GLvoid *data,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage )
|
||||
{
|
||||
driTextureObject * t = (driTextureObject *) texObj->DriverData;
|
||||
GLuint face;
|
||||
|
||||
/* which cube face or ordinary 2D image */
|
||||
switch (target) {
|
||||
case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
|
||||
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
|
||||
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
|
||||
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
|
||||
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
|
||||
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
|
||||
face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
|
||||
ASSERT(face < 6);
|
||||
break;
|
||||
default:
|
||||
face = 0;
|
||||
}
|
||||
|
||||
if ( t != NULL ) {
|
||||
driSwapOutTextureObject( t );
|
||||
}
|
||||
else {
|
||||
t = (driTextureObject *) i830AllocTexObj( texObj );
|
||||
if (!t) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
texImage->IsClientData = GL_FALSE;
|
||||
|
||||
if (I830_DEBUG & DEBUG_TEXTURE)
|
||||
fprintf(stderr, "%s: Using normal storage\n", __FUNCTION__);
|
||||
|
||||
_mesa_store_compressed_teximage2d(ctx, target, level, internalFormat, width,
|
||||
height, border, imageSize, data, texObj, texImage);
|
||||
|
||||
t->dirty_images[face] |= (1 << level);
|
||||
}
|
||||
|
||||
|
||||
static void i830CompressedTexSubImage2D( GLcontext *ctx, GLenum target, GLint level,
|
||||
GLint xoffset, GLint yoffset,
|
||||
GLsizei width, GLsizei height,
|
||||
GLenum format,
|
||||
GLsizei imageSize, const GLvoid *data,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage )
|
||||
{
|
||||
driTextureObject * t = (driTextureObject *) texObj->DriverData;
|
||||
GLuint face;
|
||||
|
||||
|
||||
/* which cube face or ordinary 2D image */
|
||||
switch (target) {
|
||||
case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
|
||||
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
|
||||
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
|
||||
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
|
||||
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
|
||||
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
|
||||
face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
|
||||
ASSERT(face < 6);
|
||||
break;
|
||||
default:
|
||||
face = 0;
|
||||
}
|
||||
|
||||
assert( t ); /* this _should_ be true */
|
||||
if ( t ) {
|
||||
driSwapOutTextureObject( t );
|
||||
}
|
||||
else {
|
||||
t = (driTextureObject *) i830AllocTexObj( texObj );
|
||||
if (!t) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
_mesa_store_compressed_texsubimage2d(ctx, target, level, xoffset, yoffset, width,
|
||||
height, format, imageSize, data, texObj, texImage);
|
||||
|
||||
t->dirty_images[face] |= (1 << level);
|
||||
}
|
||||
|
||||
|
||||
static void i830BindTexture( GLcontext *ctx, GLenum target,
|
||||
struct gl_texture_object *tObj )
|
||||
{
|
||||
assert( (target != GL_TEXTURE_2D && target != GL_TEXTURE_RECTANGLE_NV) ||
|
||||
(tObj->DriverData != NULL) );
|
||||
}
|
||||
|
||||
|
||||
static void i830DeleteTexture( GLcontext *ctx, struct gl_texture_object *tObj )
|
||||
{
|
||||
driTextureObject * t = (driTextureObject *) tObj->DriverData;
|
||||
if ( t != NULL ) {
|
||||
i830ContextPtr imesa = I830_CONTEXT( ctx );
|
||||
|
||||
if ( imesa ) {
|
||||
I830_FIREVERTICES( imesa );
|
||||
}
|
||||
|
||||
driDestroyTextureObject( t );
|
||||
}
|
||||
/* Free mipmap images and the texture object itself */
|
||||
_mesa_delete_texture_object(ctx, tObj);
|
||||
}
|
||||
|
||||
|
||||
static const struct gl_texture_format *
|
||||
i830ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
|
||||
GLenum format, GLenum type )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT( ctx );
|
||||
const GLboolean do32bpt = ( imesa->i830Screen->cpp == 4 &&
|
||||
imesa->i830Screen->textureSize > 4*1024*1024);
|
||||
|
||||
switch ( internalFormat ) {
|
||||
case 4:
|
||||
case GL_RGBA:
|
||||
case GL_COMPRESSED_RGBA:
|
||||
if ( format == GL_BGRA ) {
|
||||
if ( type == GL_UNSIGNED_INT_8_8_8_8_REV ) {
|
||||
return &_mesa_texformat_argb8888;
|
||||
}
|
||||
else if ( type == GL_UNSIGNED_SHORT_4_4_4_4_REV ) {
|
||||
return &_mesa_texformat_argb4444;
|
||||
}
|
||||
else if ( type == GL_UNSIGNED_SHORT_1_5_5_5_REV ) {
|
||||
return &_mesa_texformat_argb1555;
|
||||
}
|
||||
}
|
||||
return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb4444;
|
||||
|
||||
case 3:
|
||||
case GL_RGB:
|
||||
case GL_COMPRESSED_RGB:
|
||||
if ( format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5 ) {
|
||||
return &_mesa_texformat_rgb565;
|
||||
}
|
||||
return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_rgb565;
|
||||
|
||||
case GL_RGBA8:
|
||||
case GL_RGB10_A2:
|
||||
case GL_RGBA12:
|
||||
case GL_RGBA16:
|
||||
return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb4444;
|
||||
|
||||
case GL_RGBA4:
|
||||
case GL_RGBA2:
|
||||
return &_mesa_texformat_argb4444;
|
||||
|
||||
case GL_RGB5_A1:
|
||||
return &_mesa_texformat_argb1555;
|
||||
|
||||
case GL_RGB8:
|
||||
case GL_RGB10:
|
||||
case GL_RGB12:
|
||||
case GL_RGB16:
|
||||
return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_rgb565;
|
||||
|
||||
case GL_RGB5:
|
||||
case GL_RGB4:
|
||||
case GL_R3_G3_B2:
|
||||
return &_mesa_texformat_rgb565;
|
||||
|
||||
case GL_ALPHA:
|
||||
case GL_ALPHA4:
|
||||
case GL_ALPHA8:
|
||||
case GL_ALPHA12:
|
||||
case GL_ALPHA16:
|
||||
case GL_COMPRESSED_ALPHA:
|
||||
return &_mesa_texformat_al88;
|
||||
|
||||
case 1:
|
||||
case GL_LUMINANCE:
|
||||
case GL_LUMINANCE4:
|
||||
case GL_LUMINANCE8:
|
||||
case GL_LUMINANCE12:
|
||||
case GL_LUMINANCE16:
|
||||
case GL_COMPRESSED_LUMINANCE:
|
||||
return &_mesa_texformat_l8;
|
||||
|
||||
case 2:
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
case GL_LUMINANCE4_ALPHA4:
|
||||
case GL_LUMINANCE6_ALPHA2:
|
||||
case GL_LUMINANCE8_ALPHA8:
|
||||
case GL_LUMINANCE12_ALPHA4:
|
||||
case GL_LUMINANCE12_ALPHA12:
|
||||
case GL_LUMINANCE16_ALPHA16:
|
||||
case GL_COMPRESSED_LUMINANCE_ALPHA:
|
||||
return &_mesa_texformat_al88;
|
||||
|
||||
case GL_INTENSITY:
|
||||
case GL_INTENSITY4:
|
||||
case GL_INTENSITY8:
|
||||
case GL_INTENSITY12:
|
||||
case GL_INTENSITY16:
|
||||
case GL_COMPRESSED_INTENSITY:
|
||||
return &_mesa_texformat_i8;
|
||||
|
||||
case GL_YCBCR_MESA:
|
||||
if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
|
||||
type == GL_UNSIGNED_BYTE)
|
||||
return &_mesa_texformat_ycbcr;
|
||||
else
|
||||
return &_mesa_texformat_ycbcr_rev;
|
||||
|
||||
case GL_COMPRESSED_RGB_FXT1_3DFX:
|
||||
return &_mesa_texformat_rgb_fxt1;
|
||||
case GL_COMPRESSED_RGBA_FXT1_3DFX:
|
||||
return &_mesa_texformat_rgba_fxt1;
|
||||
|
||||
case GL_RGB_S3TC:
|
||||
case GL_RGB4_S3TC:
|
||||
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
|
||||
return &_mesa_texformat_rgb_dxt1;
|
||||
|
||||
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
|
||||
return &_mesa_texformat_rgba_dxt1;
|
||||
|
||||
case GL_RGBA_S3TC:
|
||||
case GL_RGBA4_S3TC:
|
||||
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
|
||||
return &_mesa_texformat_rgba_dxt3;
|
||||
|
||||
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
|
||||
return &_mesa_texformat_rgba_dxt5;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "unexpected texture format in %s\n", __FUNCTION__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return NULL; /* never get here */
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate a new texture object.
|
||||
* Called via ctx->Driver.NewTextureObject.
|
||||
* Note: this function will be called during context creation to
|
||||
* allocate the default texture objects.
|
||||
* Note: we could use containment here to 'derive' the driver-specific
|
||||
* texture object from the core mesa gl_texture_object. Not done at this time.
|
||||
*/
|
||||
static struct gl_texture_object *
|
||||
i830NewTextureObject( GLcontext *ctx, GLuint name, GLenum target )
|
||||
{
|
||||
struct gl_texture_object *obj;
|
||||
obj = _mesa_new_texture_object(ctx, name, target);
|
||||
i830AllocTexObj( obj );
|
||||
return obj;
|
||||
}
|
||||
|
||||
void i830InitTextureFuncs( struct dd_function_table *functions )
|
||||
{
|
||||
functions->NewTextureObject = i830NewTextureObject;
|
||||
functions->DeleteTexture = i830DeleteTexture;
|
||||
functions->ChooseTextureFormat = i830ChooseTextureFormat;
|
||||
functions->TexImage2D = i830TexImage2D;
|
||||
functions->TexSubImage2D = i830TexSubImage2D;
|
||||
functions->BindTexture = i830BindTexture;
|
||||
functions->TexParameter = i830TexParameter;
|
||||
functions->TexEnv = i830TexEnv;
|
||||
functions->IsTextureResident = driIsTextureResident;
|
||||
functions->CompressedTexImage2D = i830CompressedTexImage2D;
|
||||
functions->CompressedTexSubImage2D = i830CompressedTexSubImage2D;
|
||||
}
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
/*
|
||||
* GLX Hardware Device Driver for Intel i810
|
||||
* Copyright (C) 1999 Keith Whitwell
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Adapted for use in the I830M driver:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*/
|
||||
|
||||
#ifndef I830TEX_INC
|
||||
#define I830TEX_INC
|
||||
|
||||
#include "mtypes.h"
|
||||
#include "i830_context.h"
|
||||
#include "i830_3d_reg.h"
|
||||
#include "texmem.h"
|
||||
|
||||
#define I830_TEX_MAXLEVELS 10
|
||||
|
||||
struct i830_texture_object_t
|
||||
{
|
||||
driTextureObject base;
|
||||
|
||||
int texelBytes;
|
||||
int Pitch;
|
||||
int Height;
|
||||
char *BufAddr;
|
||||
GLenum palette_format;
|
||||
GLuint palette[256];
|
||||
struct {
|
||||
const struct gl_texture_image *image;
|
||||
int offset; /* into BufAddr */
|
||||
int height;
|
||||
int internalFormat;
|
||||
} image[6][I830_TEX_MAXLEVELS];
|
||||
|
||||
/* Support for multitexture.
|
||||
*/
|
||||
|
||||
GLuint current_unit;
|
||||
GLuint Setup[I830_TEX_SETUP_SIZE];
|
||||
GLuint dirty;
|
||||
|
||||
GLfloat max_anisotropy;
|
||||
};
|
||||
|
||||
void i830UpdateTextureState( GLcontext *ctx );
|
||||
void i830InitTextureFuncs( struct dd_function_table *functions );
|
||||
|
||||
void i830DestroyTexObj( i830ContextPtr imesa, i830TextureObjectPtr t );
|
||||
int i830UploadTexImagesLocked( i830ContextPtr imesa, i830TextureObjectPtr t );
|
||||
|
||||
#endif
|
||||
|
|
@ -1,237 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 2001 2d3d Inc., Delray Beach, FL
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_texmem.c,v 1.3 2002/12/10 01:26:53 dawes Exp $ */
|
||||
|
||||
/*
|
||||
* Author:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*
|
||||
* Heavily based on the I810 driver, which was written by:
|
||||
* Keith Whitwell <keithw@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#include "glheader.h"
|
||||
#include "macros.h"
|
||||
#include "mtypes.h"
|
||||
#include "simple_list.h"
|
||||
#include "enums.h"
|
||||
#include "texformat.h"
|
||||
|
||||
#include "i830_screen.h"
|
||||
#include "i830_dri.h"
|
||||
|
||||
#include "i830_context.h"
|
||||
#include "i830_tex.h"
|
||||
#include "i830_state.h"
|
||||
#include "i830_ioctl.h"
|
||||
|
||||
|
||||
void i830DestroyTexObj(i830ContextPtr imesa, i830TextureObjectPtr t)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
|
||||
/* See if it was the driver's current object.
|
||||
*/
|
||||
if ( imesa != NULL ) {
|
||||
for ( i = 0 ; i < imesa->glCtx->Const.MaxTextureUnits ; i++ ) {
|
||||
if ( t == imesa->CurrentTexObj[ i ] ) {
|
||||
imesa->CurrentTexObj[ i ] = NULL;
|
||||
imesa->dirty &= ~I830_UPLOAD_TEX_N( i );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(i386) || defined(__i386__)
|
||||
/* From linux kernel i386 header files, copes with odd sizes better
|
||||
* than COPY_DWORDS would:
|
||||
*/
|
||||
static __inline__ void * __memcpy(void * to, const void * from, size_t n)
|
||||
{
|
||||
int d0, d1, d2;
|
||||
__asm__ __volatile__(
|
||||
"rep ; movsl\n\t"
|
||||
"testb $2,%b4\n\t"
|
||||
"je 1f\n\t"
|
||||
"movsw\n"
|
||||
"1:\ttestb $1,%b4\n\t"
|
||||
"je 2f\n\t"
|
||||
"movsb\n"
|
||||
"2:"
|
||||
: "=&c" (d0), "=&D" (d1), "=&S" (d2)
|
||||
:"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
|
||||
: "memory");
|
||||
return (to);
|
||||
}
|
||||
#else
|
||||
/* Allow compilation on other architectures */
|
||||
#define __memcpy memcpy
|
||||
#endif
|
||||
|
||||
/* Upload an image from mesa's internal copy.
|
||||
*/
|
||||
static void i830UploadTexLevel( i830ContextPtr imesa,
|
||||
i830TextureObjectPtr t, int hwlevel )
|
||||
{
|
||||
const struct gl_texture_image *image = t->image[0][hwlevel].image;
|
||||
int j;
|
||||
|
||||
if (!image || !image->Data)
|
||||
return;
|
||||
|
||||
if (image->IsCompressed) {
|
||||
GLubyte *dst = (GLubyte *)(t->BufAddr + t->image[0][hwlevel].offset);
|
||||
GLubyte *src = (GLubyte *)image->Data;
|
||||
|
||||
if ((t->Setup[I830_TEXREG_TM0S1] & TM0S1_MT_FORMAT_MASK)==MT_COMPRESS_FXT1)
|
||||
{
|
||||
for (j = 0 ; j < image->Height/4 ; j++, dst += (t->Pitch)) {
|
||||
__memcpy(dst, src, (image->Width*2) );
|
||||
src += image->Width*2;
|
||||
}
|
||||
}
|
||||
else if ((t->Setup[I830_TEXREG_TM0S1] & TM0S1_MT_FORMAT_MASK)==MT_COMPRESS_DXT1)
|
||||
{
|
||||
for (j = 0 ; j < image->Height/4 ; j++, dst += (t->Pitch)) {
|
||||
__memcpy(dst, src, (image->Width*2) );
|
||||
src += image->Width*2;
|
||||
}
|
||||
}
|
||||
else if (((t->Setup[I830_TEXREG_TM0S1] & TM0S1_MT_FORMAT_MASK)==MT_COMPRESS_DXT2_3) || ((t->Setup[I830_TEXREG_TM0S1] & TM0S1_MT_FORMAT_MASK)==MT_COMPRESS_DXT4_5))
|
||||
{
|
||||
for (j = 0 ; j < image->Height/4 ; j++, dst += (t->Pitch)) {
|
||||
__memcpy(dst, src, (image->Width*4) );
|
||||
src += image->Width*4;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (image->Width * image->TexFormat->TexelBytes == t->Pitch) {
|
||||
GLubyte *dst = (GLubyte *)(t->BufAddr + t->image[0][hwlevel].offset);
|
||||
GLubyte *src = (GLubyte *)image->Data;
|
||||
|
||||
memcpy( dst, src, t->Pitch * image->Height );
|
||||
}
|
||||
else switch (image->TexFormat->TexelBytes) {
|
||||
case 1:
|
||||
{
|
||||
GLubyte *dst = (GLubyte *)(t->BufAddr + t->image[0][hwlevel].offset);
|
||||
GLubyte *src = (GLubyte *)image->Data;
|
||||
|
||||
for (j = 0 ; j < image->Height ; j++, dst += t->Pitch) {
|
||||
__memcpy(dst, src, image->Width );
|
||||
src += image->Width;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
{
|
||||
GLushort *dst = (GLushort *)(t->BufAddr + t->image[0][hwlevel].offset);
|
||||
GLushort *src = (GLushort *)image->Data;
|
||||
|
||||
for (j = 0 ; j < image->Height ; j++, dst += (t->Pitch/2)) {
|
||||
__memcpy(dst, src, image->Width * 2 );
|
||||
src += image->Width;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 4:
|
||||
{
|
||||
GLuint *dst = (GLuint *)(t->BufAddr + t->image[0][hwlevel].offset);
|
||||
GLuint *src = (GLuint *)image->Data;
|
||||
|
||||
for (j = 0 ; j < image->Height ; j++, dst += (t->Pitch/4)) {
|
||||
__memcpy(dst, src, image->Width * 4 );
|
||||
src += image->Width;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "%s: Not supported texel size %d\n",
|
||||
__FUNCTION__, image->TexFormat->TexelBytes);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* This is called with the lock held. May have to eject our own and/or
|
||||
* other client's texture objects to make room for the upload.
|
||||
*/
|
||||
|
||||
int i830UploadTexImagesLocked( i830ContextPtr imesa, i830TextureObjectPtr t )
|
||||
{
|
||||
int ofs;
|
||||
int i;
|
||||
|
||||
if ( t->base.memBlock == NULL ) {
|
||||
int heap;
|
||||
|
||||
heap = driAllocateTexture( imesa->texture_heaps, imesa->nr_heaps,
|
||||
(driTextureObject *) t );
|
||||
if ( heap == -1 ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Set the base offset of the texture image */
|
||||
ofs = t->base.memBlock->ofs;
|
||||
t->BufAddr = imesa->i830Screen->tex.map + ofs;
|
||||
t->Setup[I830_TEXREG_TM0S0] = (TM0S0_USE_FENCE |
|
||||
(imesa->i830Screen->textureOffset + ofs));
|
||||
|
||||
for ( i = 0 ; i < imesa->glCtx->Const.MaxTextureUnits ; i++ ) {
|
||||
if (t == imesa->CurrentTexObj[i]) {
|
||||
imesa->dirty |= I830_UPLOAD_TEX_N( i );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Let the world know we've used this memory recently.
|
||||
*/
|
||||
driUpdateTextureLRU( (driTextureObject *) t );
|
||||
|
||||
if (imesa->texture_heaps[0]->timestamp >= GET_DISPATCH_AGE(imesa))
|
||||
i830WaitAgeLocked( imesa, imesa->texture_heaps[0]->timestamp );
|
||||
|
||||
/* Upload any images that are new */
|
||||
if (t->base.dirty_images[0]) {
|
||||
const int numLevels = t->base.lastLevel - t->base.firstLevel + 1;
|
||||
|
||||
for (i = 0 ; i < numLevels ; i++) {
|
||||
if ( (t->base.dirty_images[0] & (1 << (i+t->base.firstLevel))) != 0 ) {
|
||||
i830UploadTexLevel( imesa, t, i );
|
||||
}
|
||||
}
|
||||
t->base.dirty_images[0] = 0;
|
||||
imesa->sarea->perf_boxes |= I830_BOX_TEXTURE_LOAD;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,716 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 2001 2d3d Inc., Delray Beach, FL
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_texstate.c,v 1.3 2002/12/10 01:26:53 dawes Exp $ */
|
||||
|
||||
/**
|
||||
* \file i830_texstate.c
|
||||
*
|
||||
* Heavily based on the I810 driver, which was written by Keith Whitwell.
|
||||
*
|
||||
* \author Jeff Hartmann <jhartmann@2d3d.com>
|
||||
* \author Keith Whitwell <keithw@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#include "glheader.h"
|
||||
#include "macros.h"
|
||||
#include "mtypes.h"
|
||||
#include "simple_list.h"
|
||||
#include "enums.h"
|
||||
#include "texformat.h"
|
||||
#include "texstore.h"
|
||||
|
||||
#include "mm.h"
|
||||
|
||||
#include "i830_screen.h"
|
||||
#include "i830_dri.h"
|
||||
|
||||
#include "i830_context.h"
|
||||
#include "i830_tex.h"
|
||||
#include "i830_state.h"
|
||||
#include "i830_ioctl.h"
|
||||
|
||||
#define I830_TEX_UNIT_ENABLED(unit) (1<<unit)
|
||||
|
||||
static void i830SetTexImages( i830ContextPtr imesa,
|
||||
struct gl_texture_object *tObj )
|
||||
{
|
||||
GLuint total_height, pitch, i, textureFormat;
|
||||
i830TextureObjectPtr t = (i830TextureObjectPtr) tObj->DriverData;
|
||||
const struct gl_texture_image *baseImage = tObj->Image[0][tObj->BaseLevel];
|
||||
GLint numLevels;
|
||||
|
||||
switch( baseImage->TexFormat->MesaFormat ) {
|
||||
case MESA_FORMAT_L8:
|
||||
t->texelBytes = 1;
|
||||
textureFormat = MAPSURF_8BIT | MT_8BIT_L8;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_I8:
|
||||
t->texelBytes = 1;
|
||||
textureFormat = MAPSURF_8BIT | MT_8BIT_I8;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_AL88:
|
||||
t->texelBytes = 2;
|
||||
textureFormat = MAPSURF_16BIT | MT_16BIT_AY88;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_RGB565:
|
||||
t->texelBytes = 2;
|
||||
textureFormat = MAPSURF_16BIT | MT_16BIT_RGB565;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_ARGB1555:
|
||||
t->texelBytes = 2;
|
||||
textureFormat = MAPSURF_16BIT | MT_16BIT_ARGB1555;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_ARGB4444:
|
||||
t->texelBytes = 2;
|
||||
textureFormat = MAPSURF_16BIT | MT_16BIT_ARGB4444;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_ARGB8888:
|
||||
t->texelBytes = 4;
|
||||
textureFormat = MAPSURF_32BIT | MT_32BIT_ARGB8888;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_YCBCR_REV:
|
||||
t->texelBytes = 2;
|
||||
textureFormat = (MAPSURF_422 | MT_422_YCRCB_NORMAL |
|
||||
TM0S1_COLORSPACE_CONVERSION);
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_YCBCR:
|
||||
t->texelBytes = 2;
|
||||
textureFormat = (MAPSURF_422 | MT_422_YCRCB_SWAPY | /* ??? */
|
||||
TM0S1_COLORSPACE_CONVERSION);
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_RGB_FXT1:
|
||||
case MESA_FORMAT_RGBA_FXT1:
|
||||
t->texelBytes = 2;
|
||||
textureFormat = (MAPSURF_COMPRESSED | MT_COMPRESS_FXT1);
|
||||
break;
|
||||
case MESA_FORMAT_RGBA_DXT1:
|
||||
case MESA_FORMAT_RGB_DXT1:
|
||||
/*
|
||||
* DXTn pitches are Width/4 * blocksize in bytes
|
||||
* for DXT1: blocksize=8 so Width/4*8 = Width * 2
|
||||
* for DXT3/5: blocksize=16 so Width/4*16 = Width * 4
|
||||
*/
|
||||
t->texelBytes = 2;
|
||||
textureFormat = (MAPSURF_COMPRESSED | MT_COMPRESS_DXT1);
|
||||
break;
|
||||
case MESA_FORMAT_RGBA_DXT3:
|
||||
t->texelBytes = 4;
|
||||
textureFormat = (MAPSURF_COMPRESSED | MT_COMPRESS_DXT2_3);
|
||||
break;
|
||||
case MESA_FORMAT_RGBA_DXT5:
|
||||
t->texelBytes = 4;
|
||||
textureFormat = (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "%s: bad image format\n", __FUNCTION__);
|
||||
free( t );
|
||||
return;
|
||||
}
|
||||
|
||||
/* Compute which mipmap levels we really want to send to the hardware.
|
||||
*/
|
||||
|
||||
driCalculateTextureFirstLastLevel( (driTextureObject *) t );
|
||||
|
||||
|
||||
/* Figure out the amount of memory required to hold all the mipmap
|
||||
* levels. Choose the smallest pitch to accomodate the largest
|
||||
* mipmap:
|
||||
*/
|
||||
numLevels = t->base.lastLevel - t->base.firstLevel + 1;
|
||||
|
||||
/* Pitch would be subject to additional rules if texture memory were
|
||||
* tiled. Currently it isn't.
|
||||
*/
|
||||
if (0) {
|
||||
pitch = 128;
|
||||
while (pitch < tObj->Image[0][t->base.firstLevel]->Width * t->texelBytes)
|
||||
pitch *= 2;
|
||||
}
|
||||
else {
|
||||
pitch = tObj->Image[0][t->base.firstLevel]->Width * t->texelBytes;
|
||||
pitch = (pitch + 3) & ~3;
|
||||
}
|
||||
|
||||
|
||||
/* All images must be loaded at this pitch. Count the number of
|
||||
* lines required:
|
||||
*/
|
||||
for ( total_height = i = 0 ; i < numLevels ; i++ ) {
|
||||
t->image[0][i].image = tObj->Image[0][t->base.firstLevel + i];
|
||||
if (!t->image[0][i].image)
|
||||
break;
|
||||
|
||||
t->image[0][i].offset = total_height * pitch;
|
||||
if (t->image[0][i].image->IsCompressed)
|
||||
{
|
||||
if (t->image[0][i].image->Height > 4)
|
||||
total_height += t->image[0][i].image->Height/4;
|
||||
else
|
||||
total_height += 1;
|
||||
}
|
||||
else
|
||||
total_height += t->image[0][i].image->Height;
|
||||
t->image[0][i].internalFormat = baseImage->_BaseFormat;
|
||||
}
|
||||
|
||||
t->Pitch = pitch;
|
||||
t->base.totalSize = total_height*pitch;
|
||||
t->Setup[I830_TEXREG_TM0S1] =
|
||||
(((tObj->Image[0][t->base.firstLevel]->Height - 1) << TM0S1_HEIGHT_SHIFT) |
|
||||
((tObj->Image[0][t->base.firstLevel]->Width - 1) << TM0S1_WIDTH_SHIFT) |
|
||||
textureFormat);
|
||||
t->Setup[I830_TEXREG_TM0S2] =
|
||||
((((pitch / 4) - 1) << TM0S2_PITCH_SHIFT));
|
||||
t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_MAX_MIP_MASK;
|
||||
t->Setup[I830_TEXREG_TM0S3] &= ~TM0S3_MIN_MIP_MASK;
|
||||
t->Setup[I830_TEXREG_TM0S3] |= ((numLevels - 1)*4) << TM0S3_MIN_MIP_SHIFT;
|
||||
t->dirty = I830_UPLOAD_TEX0 | I830_UPLOAD_TEX1
|
||||
| I830_UPLOAD_TEX2 | I830_UPLOAD_TEX3;
|
||||
|
||||
LOCK_HARDWARE( imesa );
|
||||
i830UploadTexImagesLocked( imesa, t );
|
||||
UNLOCK_HARDWARE( imesa );
|
||||
}
|
||||
|
||||
/* ================================================================
|
||||
* Texture combine functions
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Calculate the hardware instuctions to setup the current texture enviromnemt
|
||||
* settings. Since \c gl_texture_unit::_CurrentCombine is used, both
|
||||
* "classic" texture enviroments and GL_ARB_texture_env_combine type texture
|
||||
* environments are treated identically.
|
||||
*
|
||||
* \todo
|
||||
* This function should return \c GLboolean. When \c GL_FALSE is returned,
|
||||
* it means that an environment is selected that the hardware cannot do. This
|
||||
* is the way the Radeon and R200 drivers work.
|
||||
*
|
||||
* \todo
|
||||
* Looking at i830_3d_regs.h, it seems the i830 can do part of
|
||||
* GL_ATI_texture_env_combine3. It can handle using \c GL_ONE and
|
||||
* \c GL_ZERO as combine inputs (which the code already supports). It can
|
||||
* also handle the \c GL_MODULATE_ADD_ATI mode. Is it worth investigating
|
||||
* partial support for the extension?
|
||||
*
|
||||
* \todo
|
||||
* Some thought needs to be put into the way combiners work. The driver
|
||||
* treats the hardware as if there's a specific combine unit tied to each
|
||||
* texture unit. That's why there's the special case for a disabled texture
|
||||
* unit. That's not the way the hardware works. In reality, there are 4
|
||||
* texture units and four general instruction slots. Each instruction slot
|
||||
* can use any texture as an input. There's no need for this wierd "no-op"
|
||||
* stuff. If texture units 0 and 3 are enabled, the instructions to combine
|
||||
* them should be in slots 0 and 1, not 0 and 3 with two no-ops inbetween.
|
||||
*/
|
||||
|
||||
static void i830UpdateTexEnv( GLcontext *ctx, GLuint unit )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
const GLuint numColorArgs = texUnit->_CurrentCombine->_NumArgsRGB;
|
||||
const GLuint numAlphaArgs = texUnit->_CurrentCombine->_NumArgsA;
|
||||
|
||||
GLboolean need_constant_color = GL_FALSE;
|
||||
GLuint blendop;
|
||||
GLuint ablendop;
|
||||
GLuint args_RGB[3];
|
||||
GLuint args_A[3];
|
||||
GLuint rgb_shift = texUnit->Combine.ScaleShiftRGB;
|
||||
GLuint alpha_shift = texUnit->Combine.ScaleShiftA;
|
||||
int i;
|
||||
unsigned used;
|
||||
static const GLuint tex_blend_rgb[3] = {
|
||||
TEXPIPE_COLOR | TEXBLEND_ARG1 | TEXBLENDARG_MODIFY_PARMS,
|
||||
TEXPIPE_COLOR | TEXBLEND_ARG2 | TEXBLENDARG_MODIFY_PARMS,
|
||||
TEXPIPE_COLOR | TEXBLEND_ARG0 | TEXBLENDARG_MODIFY_PARMS,
|
||||
};
|
||||
static const GLuint tex_blend_a[3] = {
|
||||
TEXPIPE_ALPHA | TEXBLEND_ARG1 | TEXBLENDARG_MODIFY_PARMS,
|
||||
TEXPIPE_ALPHA | TEXBLEND_ARG2 | TEXBLENDARG_MODIFY_PARMS,
|
||||
TEXPIPE_ALPHA | TEXBLEND_ARG0 | TEXBLENDARG_MODIFY_PARMS,
|
||||
};
|
||||
static const GLuint op_rgb[4] = {
|
||||
0,
|
||||
TEXBLENDARG_INV_ARG,
|
||||
TEXBLENDARG_REPLICATE_ALPHA,
|
||||
TEXBLENDARG_REPLICATE_ALPHA | TEXBLENDARG_INV_ARG,
|
||||
};
|
||||
|
||||
|
||||
|
||||
imesa->TexBlendWordsUsed[unit] = 0;
|
||||
|
||||
if(I830_DEBUG&DEBUG_TEXTURE)
|
||||
fprintf(stderr, "[%s:%u] env. mode = %s\n", __FUNCTION__, __LINE__,
|
||||
_mesa_lookup_enum_by_nr(texUnit->EnvMode));
|
||||
|
||||
|
||||
if ( !texUnit->_ReallyEnabled ) {
|
||||
imesa->TexBlend[unit][0] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
|
||||
TEXPIPE_COLOR |
|
||||
ENABLE_TEXOUTPUT_WRT_SEL |
|
||||
TEXOP_OUTPUT_CURRENT |
|
||||
DISABLE_TEX_CNTRL_STAGE |
|
||||
TEXOP_SCALE_1X |
|
||||
TEXOP_MODIFY_PARMS |
|
||||
TEXBLENDOP_ARG1);
|
||||
imesa->TexBlend[unit][1] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
|
||||
TEXPIPE_ALPHA |
|
||||
ENABLE_TEXOUTPUT_WRT_SEL |
|
||||
TEXOP_OUTPUT_CURRENT |
|
||||
TEXOP_SCALE_1X |
|
||||
TEXOP_MODIFY_PARMS |
|
||||
TEXBLENDOP_ARG1);
|
||||
imesa->TexBlend[unit][2] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
|
||||
TEXPIPE_COLOR |
|
||||
TEXBLEND_ARG1 |
|
||||
TEXBLENDARG_MODIFY_PARMS |
|
||||
TEXBLENDARG_CURRENT);
|
||||
imesa->TexBlend[unit][3] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
|
||||
TEXPIPE_ALPHA |
|
||||
TEXBLEND_ARG1 |
|
||||
TEXBLENDARG_MODIFY_PARMS |
|
||||
TEXBLENDARG_CURRENT);
|
||||
imesa->TexBlendWordsUsed[unit] = 4;
|
||||
}
|
||||
else {
|
||||
switch(texUnit->_CurrentCombine->ModeRGB) {
|
||||
case GL_REPLACE:
|
||||
blendop = TEXBLENDOP_ARG1;
|
||||
break;
|
||||
case GL_MODULATE:
|
||||
blendop = TEXBLENDOP_MODULATE;
|
||||
break;
|
||||
case GL_ADD:
|
||||
blendop = TEXBLENDOP_ADD;
|
||||
break;
|
||||
case GL_ADD_SIGNED:
|
||||
blendop = TEXBLENDOP_ADDSIGNED;
|
||||
break;
|
||||
case GL_INTERPOLATE:
|
||||
blendop = TEXBLENDOP_BLEND;
|
||||
break;
|
||||
case GL_SUBTRACT:
|
||||
blendop = TEXBLENDOP_SUBTRACT;
|
||||
break;
|
||||
case GL_DOT3_RGB_EXT:
|
||||
case GL_DOT3_RGBA_EXT:
|
||||
/* The EXT version of the DOT3 extension does not support the
|
||||
* scale factor, but the ARB version (and the version in OpenGL
|
||||
* 1.3) does.
|
||||
*/
|
||||
rgb_shift = 0;
|
||||
alpha_shift = 0;
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case GL_DOT3_RGB:
|
||||
case GL_DOT3_RGBA:
|
||||
blendop = TEXBLENDOP_DOT3;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
blendop |= (rgb_shift << TEXOP_SCALE_SHIFT);
|
||||
|
||||
switch(texUnit->_CurrentCombine->ModeA) {
|
||||
case GL_REPLACE:
|
||||
ablendop = TEXBLENDOP_ARG1;
|
||||
break;
|
||||
case GL_MODULATE:
|
||||
ablendop = TEXBLENDOP_MODULATE;
|
||||
break;
|
||||
case GL_ADD:
|
||||
ablendop = TEXBLENDOP_ADD;
|
||||
break;
|
||||
case GL_ADD_SIGNED:
|
||||
ablendop = TEXBLENDOP_ADDSIGNED;
|
||||
break;
|
||||
case GL_INTERPOLATE:
|
||||
ablendop = TEXBLENDOP_BLEND;
|
||||
break;
|
||||
case GL_SUBTRACT:
|
||||
ablendop = TEXBLENDOP_SUBTRACT;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (texUnit->_CurrentCombine->ModeRGB == GL_DOT3_RGBA_EXT)
|
||||
|| (texUnit->_CurrentCombine->ModeRGB == GL_DOT3_RGBA) ) {
|
||||
ablendop = TEXBLENDOP_DOT3;
|
||||
}
|
||||
|
||||
ablendop |= (alpha_shift << TEXOP_SCALE_SHIFT);
|
||||
|
||||
/* Handle RGB args */
|
||||
for( i = 0 ; i < numColorArgs ; i++ ) {
|
||||
const int op = texUnit->_CurrentCombine->OperandRGB[i] - GL_SRC_COLOR;
|
||||
|
||||
assert( (op >= 0) && (op <= 3) );
|
||||
switch(texUnit->_CurrentCombine->SourceRGB[i]) {
|
||||
case GL_TEXTURE:
|
||||
args_RGB[i] = TEXBLENDARG_TEXEL0 + unit;
|
||||
break;
|
||||
case GL_TEXTURE0:
|
||||
case GL_TEXTURE1:
|
||||
case GL_TEXTURE2:
|
||||
case GL_TEXTURE3:
|
||||
args_RGB[i] = TEXBLENDARG_TEXEL0
|
||||
+ (texUnit->_CurrentCombine->SourceRGB[i] & 0x03);
|
||||
break;
|
||||
case GL_CONSTANT:
|
||||
args_RGB[i] = TEXBLENDARG_FACTOR_N;
|
||||
need_constant_color = GL_TRUE;
|
||||
break;
|
||||
case GL_PRIMARY_COLOR:
|
||||
args_RGB[i] = TEXBLENDARG_DIFFUSE;
|
||||
break;
|
||||
case GL_PREVIOUS:
|
||||
args_RGB[i] = TEXBLENDARG_CURRENT;
|
||||
break;
|
||||
case GL_ONE:
|
||||
args_RGB[i] = TEXBLENDARG_ONE;
|
||||
break;
|
||||
case GL_ZERO:
|
||||
args_RGB[i] = TEXBLENDARG_ONE | TEXBLENDARG_INV_ARG;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* Xor is used so that GL_ONE_MINUS_SRC_COLOR with GL_ZERO
|
||||
* works correctly.
|
||||
*/
|
||||
args_RGB[i] ^= op_rgb[op];
|
||||
}
|
||||
|
||||
/* Handle A args */
|
||||
for( i = 0 ; i < numAlphaArgs ; i++ ) {
|
||||
const int op = texUnit->_CurrentCombine->OperandA[i] - GL_SRC_ALPHA;
|
||||
|
||||
assert( (op >= 0) && (op <= 1) );
|
||||
switch(texUnit->_CurrentCombine->SourceA[i]) {
|
||||
case GL_TEXTURE:
|
||||
args_A[i] = TEXBLENDARG_TEXEL0 + unit;
|
||||
break;
|
||||
case GL_TEXTURE0:
|
||||
case GL_TEXTURE1:
|
||||
case GL_TEXTURE2:
|
||||
case GL_TEXTURE3:
|
||||
args_A[i] = TEXBLENDARG_TEXEL0
|
||||
+ (texUnit->_CurrentCombine->SourceA[i] & 0x03);
|
||||
break;
|
||||
case GL_CONSTANT:
|
||||
args_A[i] = TEXBLENDARG_FACTOR_N;
|
||||
need_constant_color = GL_TRUE;
|
||||
break;
|
||||
case GL_PRIMARY_COLOR:
|
||||
args_A[i] = TEXBLENDARG_DIFFUSE;
|
||||
break;
|
||||
case GL_PREVIOUS:
|
||||
args_A[i] = TEXBLENDARG_CURRENT;
|
||||
break;
|
||||
case GL_ONE:
|
||||
args_A[i] = TEXBLENDARG_ONE;
|
||||
break;
|
||||
case GL_ZERO:
|
||||
args_A[i] = TEXBLENDARG_ONE | TEXBLENDARG_INV_ARG;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* We cheat. :) The register values for this are the same as for
|
||||
* RGB. Xor is used so that GL_ONE_MINUS_SRC_ALPHA with GL_ZERO
|
||||
* works correctly.
|
||||
*/
|
||||
args_A[i] ^= op_rgb[op];
|
||||
}
|
||||
|
||||
/* Native Arg1 == Arg0 in GL_EXT_texture_env_combine spec */
|
||||
/* Native Arg2 == Arg1 in GL_EXT_texture_env_combine spec */
|
||||
/* Native Arg0 == Arg2 in GL_EXT_texture_env_combine spec */
|
||||
|
||||
/* Build color pipeline */
|
||||
|
||||
used = 0;
|
||||
imesa->TexBlend[unit][used++] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
|
||||
TEXPIPE_COLOR |
|
||||
ENABLE_TEXOUTPUT_WRT_SEL |
|
||||
TEXOP_OUTPUT_CURRENT |
|
||||
DISABLE_TEX_CNTRL_STAGE |
|
||||
TEXOP_MODIFY_PARMS |
|
||||
blendop);
|
||||
|
||||
imesa->TexBlend[unit][used++] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
|
||||
TEXPIPE_ALPHA |
|
||||
ENABLE_TEXOUTPUT_WRT_SEL |
|
||||
TEXOP_OUTPUT_CURRENT |
|
||||
TEXOP_MODIFY_PARMS |
|
||||
ablendop);
|
||||
|
||||
for ( i = 0 ; i < numColorArgs ; i++ ) {
|
||||
imesa->TexBlend[unit][used++] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
|
||||
tex_blend_rgb[i] |
|
||||
args_RGB[i]);
|
||||
}
|
||||
|
||||
for ( i = 0 ; i < numAlphaArgs ; i++ ) {
|
||||
imesa->TexBlend[unit][used++] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
|
||||
tex_blend_a[i] |
|
||||
args_A[i]);
|
||||
}
|
||||
|
||||
|
||||
if ( need_constant_color ) {
|
||||
GLubyte r, g, b, a;
|
||||
const GLfloat * const fc = texUnit->EnvColor;
|
||||
|
||||
FLOAT_COLOR_TO_UBYTE_COLOR(r, fc[RCOMP]);
|
||||
FLOAT_COLOR_TO_UBYTE_COLOR(g, fc[GCOMP]);
|
||||
FLOAT_COLOR_TO_UBYTE_COLOR(b, fc[BCOMP]);
|
||||
FLOAT_COLOR_TO_UBYTE_COLOR(a, fc[ACOMP]);
|
||||
|
||||
imesa->TexBlend[unit][used++] = STATE3D_COLOR_FACTOR_CMD(unit);
|
||||
imesa->TexBlend[unit][used++] = ((a << 24) | (r << 16) | (g << 8) | b);
|
||||
}
|
||||
|
||||
imesa->TexBlendWordsUsed[unit] = used;
|
||||
}
|
||||
|
||||
I830_STATECHANGE( imesa, I830_UPLOAD_TEXBLEND_N(unit) );
|
||||
}
|
||||
|
||||
|
||||
/* This is bogus -- can't load the same texture object on two units.
|
||||
*/
|
||||
static void i830TexSetUnit( i830TextureObjectPtr t, GLuint unit )
|
||||
{
|
||||
if(I830_DEBUG&DEBUG_TEXTURE)
|
||||
fprintf(stderr, "%s unit(%d)\n", __FUNCTION__, unit);
|
||||
|
||||
t->Setup[I830_TEXREG_TM0LI] = (STATE3D_LOAD_STATE_IMMEDIATE_2 |
|
||||
(LOAD_TEXTURE_MAP0 << unit) | 4);
|
||||
|
||||
I830_SET_FIELD(t->Setup[I830_TEXREG_MCS], MAP_UNIT_MASK, MAP_UNIT(unit));
|
||||
|
||||
t->current_unit = unit;
|
||||
t->base.bound |= (1U << unit);
|
||||
}
|
||||
|
||||
#define TEXCOORDTYPE_MASK (~((1<<13)|(1<<12)|(1<<11)))
|
||||
|
||||
|
||||
static GLboolean enable_tex_common( GLcontext *ctx, GLuint unit )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
struct gl_texture_object *tObj = texUnit->_Current;
|
||||
i830TextureObjectPtr t = (i830TextureObjectPtr)tObj->DriverData;
|
||||
|
||||
/* Fallback if there's a texture border */
|
||||
if ( tObj->Image[0][tObj->BaseLevel]->Border > 0 ) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* Upload teximages (not pipelined)
|
||||
*/
|
||||
if (t->base.dirty_images[0]) {
|
||||
i830SetTexImages( imesa, tObj );
|
||||
if (!t->base.memBlock) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update state if this is a different texture object to last
|
||||
* time.
|
||||
*/
|
||||
if (imesa->CurrentTexObj[unit] != t) {
|
||||
|
||||
if ( imesa->CurrentTexObj[unit] != NULL ) {
|
||||
/* The old texture is no longer bound to this texture unit.
|
||||
* Mark it as such.
|
||||
*/
|
||||
|
||||
imesa->CurrentTexObj[unit]->base.bound &= ~(1U << unit);
|
||||
}
|
||||
|
||||
I830_STATECHANGE( imesa, I830_UPLOAD_TEX_N(unit) );
|
||||
imesa->CurrentTexObj[unit] = t;
|
||||
i830TexSetUnit(t, unit);
|
||||
}
|
||||
|
||||
/* Update texture environment if texture object image format or
|
||||
* texture environment state has changed.
|
||||
*
|
||||
* KW: doesn't work -- change from tex0 only to tex0+tex1 gets
|
||||
* missed (need to update last stage flag?). Call
|
||||
* i830UpdateTexEnv always.
|
||||
*/
|
||||
if (tObj->Image[0][tObj->BaseLevel]->_BaseFormat !=
|
||||
imesa->TexEnvImageFmt[unit]) {
|
||||
imesa->TexEnvImageFmt[unit] = tObj->Image[0][tObj->BaseLevel]->_BaseFormat;
|
||||
}
|
||||
i830UpdateTexEnv( ctx, unit );
|
||||
imesa->TexEnabledMask |= I830_TEX_UNIT_ENABLED(unit);
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
static GLboolean enable_tex_rect( GLcontext *ctx, GLuint unit )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
struct gl_texture_object *tObj = texUnit->_Current;
|
||||
i830TextureObjectPtr t = (i830TextureObjectPtr)tObj->DriverData;
|
||||
GLuint mcs = t->Setup[I830_TEXREG_MCS];
|
||||
|
||||
mcs &= ~TEXCOORDS_ARE_NORMAL;
|
||||
mcs |= TEXCOORDS_ARE_IN_TEXELUNITS;
|
||||
|
||||
if (mcs != t->Setup[I830_TEXREG_MCS]) {
|
||||
I830_STATECHANGE( imesa, I830_UPLOAD_TEX_N(unit) );
|
||||
t->Setup[I830_TEXREG_MCS] = mcs;
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static GLboolean enable_tex_2d( GLcontext *ctx, GLuint unit )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
struct gl_texture_object *tObj = texUnit->_Current;
|
||||
i830TextureObjectPtr t = (i830TextureObjectPtr)tObj->DriverData;
|
||||
GLuint mcs = t->Setup[I830_TEXREG_MCS];
|
||||
|
||||
mcs &= ~TEXCOORDS_ARE_IN_TEXELUNITS;
|
||||
mcs |= TEXCOORDS_ARE_NORMAL;
|
||||
|
||||
if (mcs != t->Setup[I830_TEXREG_MCS]) {
|
||||
I830_STATECHANGE( imesa, I830_UPLOAD_TEX_N(unit) );
|
||||
t->Setup[I830_TEXREG_MCS] = mcs;
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static GLboolean disable_tex( GLcontext *ctx, int unit )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
|
||||
/* This is happening too often. I need to conditionally send diffuse
|
||||
* state to the card. Perhaps a diffuse dirty flag of some kind.
|
||||
* Will need to change this logic if more than 2 texture units are
|
||||
* used. We need to only do this up to the last unit enabled, or unit
|
||||
* one if nothing is enabled.
|
||||
*/
|
||||
|
||||
if ( imesa->CurrentTexObj[unit] != NULL ) {
|
||||
/* The old texture is no longer bound to this texture unit.
|
||||
* Mark it as such.
|
||||
*/
|
||||
|
||||
imesa->CurrentTexObj[unit]->base.bound &= ~(1U << unit);
|
||||
imesa->CurrentTexObj[unit] = NULL;
|
||||
}
|
||||
|
||||
imesa->TexEnvImageFmt[unit] = 0;
|
||||
imesa->dirty &= ~(I830_UPLOAD_TEX_N(unit));
|
||||
|
||||
i830UpdateTexEnv( ctx, unit );
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
static GLboolean i830UpdateTexUnit( GLcontext *ctx, GLuint unit )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
|
||||
imesa->TexEnabledMask &= ~(I830_TEX_UNIT_ENABLED(unit));
|
||||
|
||||
if (texUnit->_ReallyEnabled == TEXTURE_2D_BIT) {
|
||||
return (enable_tex_common( ctx, unit ) &&
|
||||
enable_tex_2d( ctx, unit ));
|
||||
}
|
||||
else if (texUnit->_ReallyEnabled == TEXTURE_RECT_BIT) {
|
||||
return (enable_tex_common( ctx, unit ) &&
|
||||
enable_tex_rect( ctx, unit ));
|
||||
}
|
||||
else if (texUnit->_ReallyEnabled) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
else {
|
||||
return disable_tex( ctx, unit );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void i830UpdateTextureState( GLcontext *ctx )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
int i;
|
||||
int last_stage = 0;
|
||||
GLboolean ok;
|
||||
|
||||
for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) {
|
||||
if ( (ctx->Texture.Unit[i]._ReallyEnabled == TEXTURE_2D_BIT)
|
||||
|| (ctx->Texture.Unit[i]._ReallyEnabled == TEXTURE_RECT_BIT) ) {
|
||||
last_stage = i;
|
||||
}
|
||||
}
|
||||
|
||||
ok = GL_TRUE;
|
||||
for ( i = 0 ; i <= last_stage ; i++ ) {
|
||||
ok = ok && i830UpdateTexUnit( ctx, i );
|
||||
}
|
||||
|
||||
FALLBACK( imesa, I830_FALLBACK_TEXTURE, !ok );
|
||||
|
||||
|
||||
/* Make sure last stage is set correctly */
|
||||
imesa->TexBlend[last_stage][0] |= TEXOP_LAST_STAGE;
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,37 +0,0 @@
|
|||
/*
|
||||
* GLX Hardware Device Driver for Intel i810
|
||||
* Copyright (C) 1999 Keith Whitwell
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Adapted for use in the I830M:
|
||||
* Jeff Hartmann <jhartmann@2d3d.com>
|
||||
*/
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_tris.h,v 1.3 2002/09/09 19:18:48 dawes Exp $ */
|
||||
|
||||
#ifndef I830TRIS_INC
|
||||
#define I830TRIS_INC
|
||||
|
||||
#include "mtypes.h"
|
||||
|
||||
extern void i830PrintRenderState( const char *msg, GLuint state );
|
||||
extern void i830InitTriFuncs( GLcontext *ctx );
|
||||
extern void i830RasterPrimitive( GLcontext *ctx, GLenum rprim, GLuint hwprim );
|
||||
|
||||
#endif
|
||||
|
|
@ -1,288 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 2001 VA Linux Systems Inc., Fremont, California.
|
||||
Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
license, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i830_common.h,v 1.2 2002/12/10 01:27:05 dawes Exp $ */
|
||||
|
||||
/* Author: Jeff Hartmann <jhartmann@valinux.com>
|
||||
|
||||
Converted to common header format:
|
||||
Jens Owen <jens@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#ifndef _I830_COMMON_H_
|
||||
#define _I830_COMMON_H_
|
||||
|
||||
/* WARNING: These defines must be the same as what the Xserver uses.
|
||||
* if you change them, you must change the defines in the Xserver.
|
||||
*/
|
||||
|
||||
#ifndef _I830_DEFINES_
|
||||
#define _I830_DEFINES_
|
||||
|
||||
#define I830_DMA_BUF_ORDER 12
|
||||
#define I830_DMA_BUF_SZ (1<<I830_DMA_BUF_ORDER)
|
||||
#define I830_DMA_BUF_NR 256
|
||||
#define I830_NR_SAREA_CLIPRECTS 8
|
||||
|
||||
/* Each region is a minimum of 64k, and there are at most 64 of them.
|
||||
*/
|
||||
#define I830_NR_TEX_REGIONS 64
|
||||
#define I830_LOG_MIN_TEX_REGION_SIZE 16
|
||||
|
||||
/* if defining I830_ENABLE_4_TEXTURES, do it in i830_3d_reg.h, too */
|
||||
#if !defined(I830_ENABLE_4_TEXTURES)
|
||||
#define I830_TEXTURE_COUNT 2
|
||||
#define I830_TEXBLEND_COUNT 2 /* always same as TEXTURE_COUNT? */
|
||||
#else /* defined(I830_ENABLE_4_TEXTURES) */
|
||||
#define I830_TEXTURE_COUNT 4
|
||||
#define I830_TEXBLEND_COUNT 4 /* always same as TEXTURE_COUNT? */
|
||||
#endif /* I830_ENABLE_4_TEXTURES */
|
||||
|
||||
#define I830_TEXBLEND_SIZE 12 /* (4 args + op) * 2 + COLOR_FACTOR */
|
||||
|
||||
#define I830_UPLOAD_CTX 0x1
|
||||
#define I830_UPLOAD_BUFFERS 0x2
|
||||
#define I830_UPLOAD_CLIPRECTS 0x4
|
||||
#define I830_UPLOAD_TEX0_IMAGE 0x100 /* handled clientside */
|
||||
#define I830_UPLOAD_TEX0_CUBE 0x200 /* handled clientside */
|
||||
#define I830_UPLOAD_TEX1_IMAGE 0x400 /* handled clientside */
|
||||
#define I830_UPLOAD_TEX1_CUBE 0x800 /* handled clientside */
|
||||
#define I830_UPLOAD_TEX2_IMAGE 0x1000 /* handled clientside */
|
||||
#define I830_UPLOAD_TEX2_CUBE 0x2000 /* handled clientside */
|
||||
#define I830_UPLOAD_TEX3_IMAGE 0x4000 /* handled clientside */
|
||||
#define I830_UPLOAD_TEX3_CUBE 0x8000 /* handled clientside */
|
||||
#define I830_UPLOAD_TEX_N_IMAGE(n) (0x100 << (n * 2))
|
||||
#define I830_UPLOAD_TEX_N_CUBE(n) (0x200 << (n * 2))
|
||||
#define I830_UPLOAD_TEXIMAGE_MASK 0xff00
|
||||
#define I830_UPLOAD_TEX0 0x10000
|
||||
#define I830_UPLOAD_TEX1 0x20000
|
||||
#define I830_UPLOAD_TEX2 0x40000
|
||||
#define I830_UPLOAD_TEX3 0x80000
|
||||
#define I830_UPLOAD_TEX_N(n) (0x10000 << (n))
|
||||
#define I830_UPLOAD_TEX_MASK 0xf0000
|
||||
#define I830_UPLOAD_TEXBLEND0 0x100000
|
||||
#define I830_UPLOAD_TEXBLEND1 0x200000
|
||||
#define I830_UPLOAD_TEXBLEND2 0x400000
|
||||
#define I830_UPLOAD_TEXBLEND3 0x800000
|
||||
#define I830_UPLOAD_TEXBLEND_N(n) (0x100000 << (n))
|
||||
#define I830_UPLOAD_TEXBLEND_MASK 0xf00000
|
||||
#define I830_UPLOAD_TEX_PALETTE_N(n) (0x1000000 << (n))
|
||||
#define I830_UPLOAD_TEX_PALETTE_SHARED 0x4000000
|
||||
#define I830_UPLOAD_STIPPLE 0x8000000
|
||||
|
||||
/* Indices into buf.Setup where various bits of state are mirrored per
|
||||
* context and per buffer. These can be fired at the card as a unit,
|
||||
* or in a piecewise fashion as required.
|
||||
*/
|
||||
|
||||
/* Destbuffer state
|
||||
* - backbuffer linear offset and pitch -- invarient in the current dri
|
||||
* - zbuffer linear offset and pitch -- also invarient
|
||||
* - drawing origin in back and depth buffers.
|
||||
*
|
||||
* Keep the depth/back buffer state here to acommodate private buffers
|
||||
* in the future.
|
||||
*/
|
||||
|
||||
#define I830_DESTREG_CBUFADDR 0
|
||||
/* Invarient */
|
||||
#define I830_DESTREG_DBUFADDR 1
|
||||
#define I830_DESTREG_DV0 2
|
||||
#define I830_DESTREG_DV1 3
|
||||
#define I830_DESTREG_SENABLE 4
|
||||
#define I830_DESTREG_SR0 5
|
||||
#define I830_DESTREG_SR1 6
|
||||
#define I830_DESTREG_SR2 7
|
||||
#define I830_DESTREG_DR0 8
|
||||
#define I830_DESTREG_DR1 9
|
||||
#define I830_DESTREG_DR2 10
|
||||
#define I830_DESTREG_DR3 11
|
||||
#define I830_DESTREG_DR4 12
|
||||
#define I830_DEST_SETUP_SIZE 13
|
||||
|
||||
/* Context state
|
||||
*/
|
||||
#define I830_CTXREG_STATE1 0
|
||||
#define I830_CTXREG_STATE2 1
|
||||
#define I830_CTXREG_STATE3 2
|
||||
#define I830_CTXREG_STATE4 3
|
||||
#define I830_CTXREG_STATE5 4
|
||||
#define I830_CTXREG_IALPHAB 5
|
||||
#define I830_CTXREG_STENCILTST 6
|
||||
#define I830_CTXREG_ENABLES_1 7
|
||||
#define I830_CTXREG_ENABLES_2 8
|
||||
#define I830_CTXREG_AA 9
|
||||
#define I830_CTXREG_FOGCOLOR 10
|
||||
#define I830_CTXREG_BLENDCOLR0 11
|
||||
#define I830_CTXREG_BLENDCOLR 12 /* Dword 1 of 2 dword command */
|
||||
#define I830_CTXREG_VF 13
|
||||
#define I830_CTXREG_VF2 14
|
||||
#define I830_CTXREG_MCSB0 15
|
||||
#define I830_CTXREG_MCSB1 16
|
||||
#define I830_CTX_SETUP_SIZE 17
|
||||
|
||||
/* 1.3: Stipple state
|
||||
*/
|
||||
#define I830_STPREG_ST0 0
|
||||
#define I830_STPREG_ST1 1
|
||||
#define I830_STP_SETUP_SIZE 2
|
||||
|
||||
/* Texture state (per tex unit)
|
||||
*/
|
||||
#define I830_TEXREG_MI0 0 /* GFX_OP_MAP_INFO (6 dwords) */
|
||||
#define I830_TEXREG_MI1 1
|
||||
#define I830_TEXREG_MI2 2
|
||||
#define I830_TEXREG_MI3 3
|
||||
#define I830_TEXREG_MI4 4
|
||||
#define I830_TEXREG_MI5 5
|
||||
#define I830_TEXREG_MF 6 /* GFX_OP_MAP_FILTER */
|
||||
#define I830_TEXREG_MLC 7 /* GFX_OP_MAP_LOD_CTL */
|
||||
#define I830_TEXREG_MLL 8 /* GFX_OP_MAP_LOD_LIMITS */
|
||||
#define I830_TEXREG_MCS 9 /* GFX_OP_MAP_COORD_SETS */
|
||||
#define I830_TEX_SETUP_SIZE 10
|
||||
|
||||
/* New version. Kernel auto-detects.
|
||||
*/
|
||||
#define I830_TEXREG_TM0LI 0 /* load immediate 2 texture map n */
|
||||
#define I830_TEXREG_TM0S0 1
|
||||
#define I830_TEXREG_TM0S1 2
|
||||
#define I830_TEXREG_TM0S2 3
|
||||
#define I830_TEXREG_TM0S3 4
|
||||
#define I830_TEXREG_TM0S4 5
|
||||
#define I830_TEXREG_NOP0 6 /* noop */
|
||||
#define I830_TEXREG_NOP1 7 /* noop */
|
||||
#define I830_TEXREG_NOP2 8 /* noop */
|
||||
#define __I830_TEXREG_MCS 9 /* GFX_OP_MAP_COORD_SETS -- shared */
|
||||
#define __I830_TEX_SETUP_SIZE 10
|
||||
|
||||
|
||||
#define I830_FRONT 0x1
|
||||
#define I830_BACK 0x2
|
||||
#define I830_DEPTH 0x4
|
||||
|
||||
/* Driver specific DRM command indices
|
||||
* NOTE: these are not OS specific, but they are driver specific
|
||||
*/
|
||||
#define DRM_I830_INIT 0x00
|
||||
#define DRM_I830_VERTEX 0x01
|
||||
#define DRM_I830_CLEAR 0x02
|
||||
#define DRM_I830_FLUSH 0x03
|
||||
#define DRM_I830_GETAGE 0x04
|
||||
#define DRM_I830_GETBUF 0x05
|
||||
#define DRM_I830_SWAP 0x06
|
||||
#define DRM_I830_COPY 0x07
|
||||
#define DRM_I830_DOCOPY 0x08
|
||||
#define DRM_I830_FLIP 0x09
|
||||
#define DRM_I830_IRQ_EMIT 0x0a
|
||||
#define DRM_I830_IRQ_WAIT 0x0b
|
||||
#define DRM_I830_GETPARAM 0x0c
|
||||
#define DRM_I830_SETPARAM 0x0d
|
||||
|
||||
#endif /* _I830_DEFINES_ */
|
||||
|
||||
typedef struct {
|
||||
enum {
|
||||
I830_INIT_DMA = 0x01,
|
||||
I830_CLEANUP_DMA = 0x02
|
||||
} func;
|
||||
unsigned int mmio_offset;
|
||||
unsigned int buffers_offset;
|
||||
int sarea_priv_offset;
|
||||
unsigned int ring_start;
|
||||
unsigned int ring_end;
|
||||
unsigned int ring_size;
|
||||
unsigned int front_offset;
|
||||
unsigned int back_offset;
|
||||
unsigned int depth_offset;
|
||||
unsigned int w;
|
||||
unsigned int h;
|
||||
unsigned int pitch;
|
||||
unsigned int pitch_bits;
|
||||
unsigned int back_pitch;
|
||||
unsigned int depth_pitch;
|
||||
unsigned int cpp;
|
||||
} drmI830Init;
|
||||
|
||||
typedef struct {
|
||||
int clear_color;
|
||||
int clear_depth;
|
||||
int flags;
|
||||
unsigned int clear_colormask;
|
||||
unsigned int clear_depthmask;
|
||||
} drmI830Clear;
|
||||
|
||||
/* These may be placeholders if we have more cliprects than
|
||||
* I830_NR_SAREA_CLIPRECTS. In that case, the client sets discard to
|
||||
* false, indicating that the buffer will be dispatched again with a
|
||||
* new set of cliprects.
|
||||
*/
|
||||
typedef struct {
|
||||
int idx; /* buffer index */
|
||||
int used; /* nr bytes in use */
|
||||
int discard; /* client is finished with the buffer? */
|
||||
} drmI830Vertex;
|
||||
|
||||
typedef struct {
|
||||
int idx; /* buffer index */
|
||||
int used; /* nr bytes in use */
|
||||
void *address; /* Address to copy from */
|
||||
} drmI830Copy;
|
||||
|
||||
typedef struct {
|
||||
void *virtual;
|
||||
int request_idx;
|
||||
int request_size;
|
||||
int granted;
|
||||
} drmI830DMA;
|
||||
|
||||
typedef struct drm_i830_irq_emit {
|
||||
int *irq_seq;
|
||||
} drmI830IrqEmit;
|
||||
|
||||
typedef struct drm_i830_irq_wait {
|
||||
int irq_seq;
|
||||
} drmI830IrqWait;
|
||||
|
||||
typedef struct drm_i830_getparam {
|
||||
int param;
|
||||
int *value;
|
||||
} drmI830GetParam;
|
||||
|
||||
#define I830_PARAM_IRQ_ACTIVE 1
|
||||
|
||||
|
||||
typedef struct drm_i830_setparam {
|
||||
int param;
|
||||
int value;
|
||||
} drmI830SetParam;
|
||||
|
||||
#define I830_SETPARAM_USE_MI_BATCHBUFFER_START 1
|
||||
|
||||
|
||||
|
||||
#endif /* _I830_DRM_H_ */
|
||||
|
|
@ -1,140 +0,0 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i830_dri.h,v 1.5 2002/12/10 01:27:05 dawes Exp $ */
|
||||
|
||||
#ifndef _I830_DRI_H
|
||||
#define _I830_DRI_H
|
||||
|
||||
#include "drm.h" /* HACK!!! why doesn't xf86drm.h work??? */
|
||||
/* #include "xf86drm.h" */
|
||||
#include "i830_common.h"
|
||||
|
||||
#define I830_MAX_DRAWABLES 256
|
||||
|
||||
#define I830_MAJOR_VERSION 1
|
||||
#define I830_MINOR_VERSION 3
|
||||
#define I830_PATCHLEVEL 0
|
||||
|
||||
#define I830_REG_SIZE 0x80000
|
||||
|
||||
typedef struct _I830DRIRec {
|
||||
drm_handle_t regs;
|
||||
drmSize regsSize;
|
||||
|
||||
drmSize backbufferSize;
|
||||
drm_handle_t backbuffer;
|
||||
|
||||
drmSize depthbufferSize;
|
||||
drm_handle_t depthbuffer;
|
||||
|
||||
drm_handle_t textures;
|
||||
int textureSize;
|
||||
|
||||
drm_handle_t agp_buffers;
|
||||
drmSize agp_buf_size;
|
||||
|
||||
int deviceID;
|
||||
int width;
|
||||
int height;
|
||||
int mem;
|
||||
int cpp;
|
||||
int bitsPerPixel;
|
||||
int fbOffset;
|
||||
int fbStride;
|
||||
|
||||
int backOffset;
|
||||
int depthOffset;
|
||||
|
||||
int auxPitch;
|
||||
int auxPitchBits;
|
||||
|
||||
int logTextureGranularity;
|
||||
int textureOffset;
|
||||
|
||||
/* For non-dma direct rendering.
|
||||
*/
|
||||
int ringOffset;
|
||||
int ringSize;
|
||||
|
||||
drmBufMapPtr drmBufs;
|
||||
int irq;
|
||||
int sarea_priv_offset;
|
||||
} I830DRIRec, *I830DRIPtr;
|
||||
|
||||
typedef struct {
|
||||
/* Nothing here yet */
|
||||
int dummy;
|
||||
} I830ConfigPrivRec, *I830ConfigPrivPtr;
|
||||
|
||||
typedef struct {
|
||||
/* Nothing here yet */
|
||||
int dummy;
|
||||
} I830DRIContextRec, *I830DRIContextPtr;
|
||||
|
||||
/* Warning: If you change the SAREA structure you must change the kernel
|
||||
* structure as well */
|
||||
|
||||
typedef struct _I830SAREA {
|
||||
unsigned int ContextState[I830_CTX_SETUP_SIZE];
|
||||
unsigned int BufferState[I830_DEST_SETUP_SIZE];
|
||||
unsigned int TexState[I830_TEXTURE_COUNT][I830_TEX_SETUP_SIZE];
|
||||
unsigned int TexBlendState[I830_TEXBLEND_COUNT][I830_TEXBLEND_SIZE];
|
||||
unsigned int TexBlendStateWordsUsed[I830_TEXBLEND_COUNT];
|
||||
unsigned int Palette[2][256];
|
||||
unsigned int dirty;
|
||||
|
||||
unsigned int nbox;
|
||||
drm_clip_rect_t boxes[I830_NR_SAREA_CLIPRECTS];
|
||||
|
||||
/* Maintain an LRU of contiguous regions of texture space. If
|
||||
* you think you own a region of texture memory, and it has an
|
||||
* age different to the one you set, then you are mistaken and
|
||||
* it has been stolen by another client. If global texAge
|
||||
* hasn't changed, there is no need to walk the list.
|
||||
*
|
||||
* These regions can be used as a proxy for the fine-grained
|
||||
* texture information of other clients - by maintaining them
|
||||
* in the same lru which is used to age their own textures,
|
||||
* clients have an approximate lru for the whole of global
|
||||
* texture space, and can make informed decisions as to which
|
||||
* areas to kick out. There is no need to choose whether to
|
||||
* kick out your own texture or someone else's - simply eject
|
||||
* them all in LRU order.
|
||||
*/
|
||||
|
||||
drmTextureRegion texList[I830_NR_TEX_REGIONS + 1];
|
||||
/* Last elt is sentinal */
|
||||
int texAge; /* last time texture was uploaded */
|
||||
int last_enqueue; /* last time a buffer was enqueued */
|
||||
int last_dispatch; /* age of the most recently dispatched buffer */
|
||||
int last_quiescent; /* */
|
||||
int ctxOwner; /* last context to upload state */
|
||||
|
||||
int vertex_prim;
|
||||
|
||||
int pf_enabled; /* is pageflipping allowed? */
|
||||
int pf_active; /* is pageflipping active right now? */
|
||||
int pf_current_page; /* which buffer is being displayed? */
|
||||
|
||||
int perf_boxes; /* performance boxes to be displayed */
|
||||
|
||||
/* Here's the state for texunits 2,3:
|
||||
*/
|
||||
unsigned int TexState2[I830_TEX_SETUP_SIZE];
|
||||
unsigned int TexBlendState2[I830_TEXBLEND_SIZE];
|
||||
unsigned int TexBlendStateWordsUsed2;
|
||||
|
||||
unsigned int TexState3[I830_TEX_SETUP_SIZE];
|
||||
unsigned int TexBlendState3[I830_TEXBLEND_SIZE];
|
||||
unsigned int TexBlendStateWordsUsed3;
|
||||
|
||||
unsigned int StippleState[I830_STP_SETUP_SIZE];
|
||||
} I830SAREARec, *I830SAREAPtr;
|
||||
|
||||
/* Flags for perf_boxes
|
||||
*/
|
||||
#define I830_BOX_RING_EMPTY 0x1 /* populated by kernel */
|
||||
#define I830_BOX_FLIP 0x2 /* populated by kernel */
|
||||
#define I830_BOX_WAIT 0x4 /* populated by kernel & client */
|
||||
#define I830_BOX_TEXTURE_LOAD 0x8 /* populated by kernel */
|
||||
#define I830_BOX_LOST_CONTEXT 0x10 /* populated by client */
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Reference in a new issue