remove very old i830 code

This commit is contained in:
Alan Hourihane 2006-01-24 19:59:54 +00:00
parent f3134ca7ad
commit 65573edd1b
23 changed files with 0 additions and 9347 deletions

View file

@ -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:

View file

@ -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)

View file

@ -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__);
}
}

View file

@ -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

View file

@ -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;
}

View file

@ -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

View file

@ -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;
}

View file

@ -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

View file

@ -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 */
};

View file

@ -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;
}

View file

@ -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

View file

@ -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);
}
}

View file

@ -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

View file

@ -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

View file

@ -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;
}

View file

@ -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

View file

@ -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;
}

View file

@ -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

View file

@ -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

View file

@ -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_ */

View file

@ -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