diff options
author | Eric Anholt <[email protected]> | 2005-10-25 20:37:01 +0000 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2005-10-25 20:37:01 +0000 |
commit | f1113fa99d8767e58d223b5bbdd7e19e9e89613f (patch) | |
tree | 236d459dc9744b9924aac281d77170ef7f827ca7 /src/mesa/drivers/dri | |
parent | 7e4cc1c29fc1fa32ba6bad4f827e357b9aa79f3a (diff) |
Initial add of some (disabled) SiS 6326 drawing code integrated from Alan Cox's
last drop I saw, which was in turn based on a code drop of mine. Texturing,
culling, and several extensions are unimplemented, and some features could
probably be improved. It's untested, but there don't appear to be regressions on
the 300-series code, so I'd like to get these bits in now so that it can be
worked on as not a huge diff.
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r-- | src/mesa/drivers/dri/sis/Makefile | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/sis/sis6326_clear.c | 236 | ||||
-rw-r--r-- | src/mesa/drivers/dri/sis/sis6326_reg.h | 408 | ||||
-rw-r--r-- | src/mesa/drivers/dri/sis/sis6326_state.c | 753 | ||||
-rw-r--r-- | src/mesa/drivers/dri/sis/sis_context.c | 193 | ||||
-rw-r--r-- | src/mesa/drivers/dri/sis/sis_context.h | 18 | ||||
-rw-r--r-- | src/mesa/drivers/dri/sis/sis_lock.c | 5 | ||||
-rw-r--r-- | src/mesa/drivers/dri/sis/sis_state.c | 8 | ||||
-rw-r--r-- | src/mesa/drivers/dri/sis/sis_state.h | 27 | ||||
-rw-r--r-- | src/mesa/drivers/dri/sis/sis_tris.c | 70 | ||||
-rw-r--r-- | src/mesa/drivers/dri/sis/sis_tritmp.h | 232 |
11 files changed, 1894 insertions, 58 deletions
diff --git a/src/mesa/drivers/dri/sis/Makefile b/src/mesa/drivers/dri/sis/Makefile index 32c64bdbf30..d2354e67764 100644 --- a/src/mesa/drivers/dri/sis/Makefile +++ b/src/mesa/drivers/dri/sis/Makefile @@ -10,6 +10,8 @@ LIBNAME = sis_dri.so # MINIGLX_SOURCES = server/sis_dri.c DRIVER_SOURCES = \ + sis6326_state.c \ + sis6326_clear.c \ sis_alloc.c \ sis_clear.c \ sis_context.c \ diff --git a/src/mesa/drivers/dri/sis/sis6326_clear.c b/src/mesa/drivers/dri/sis/sis6326_clear.c new file mode 100644 index 00000000000..29b95f94d94 --- /dev/null +++ b/src/mesa/drivers/dri/sis/sis6326_clear.c @@ -0,0 +1,236 @@ +/* + * Copyright 2005 Eric Anholt + * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS 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: + * Eric Anholt <[email protected]> + * + */ + +#include "sis_context.h" +#include "sis_state.h" +#include "sis_lock.h" +#include "sis_reg.h" + +#include "swrast/swrast.h" +#include "macros.h" + +static void sis_clear_front_buffer(GLcontext *ctx, GLenum mask, GLint x, + GLint y, GLint width, GLint height); +static void sis_clear_back_buffer(GLcontext *ctx, GLenum mask, GLint x, + GLint y, GLint width, GLint height); +static void sis_clear_z_buffer(GLcontext * ctx, GLbitfield mask, GLint x, + GLint y, GLint width, GLint height ); + +static void +set_color_pattern( sisContextPtr smesa, GLubyte red, GLubyte green, + GLubyte blue, GLubyte alpha ) +{ + /* XXX only RGB565 and ARGB8888 */ + switch (smesa->colorFormat) + { + case DST_FORMAT_ARGB_8888: + smesa->clearColorPattern = (alpha << 24) + + (red << 16) + (green << 8) + (blue); + break; + case DST_FORMAT_RGB_565: + smesa->clearColorPattern = ((red >> 3) << 11) + + ((green >> 2) << 5) + (blue >> 3); + smesa->clearColorPattern |= smesa->clearColorPattern << 16; + break; + default: + sis_fatal_error("Bad dst color format\n"); + } +} + +void +sis6326UpdateZPattern(sisContextPtr smesa, GLclampd z) +{ + smesa->clearZStencilPattern = FLOAT_TO_USHORT(z * 65535.0); +} + +void +sis6326DDClear(GLcontext *ctx, GLbitfield mask, GLboolean all, + GLint x, GLint y, GLint width, GLint height) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + GLint x1, y1, width1, height1; + + if (all) { + GLframebuffer *buffer = ctx->DrawBuffer; + + x1 = 0; + y1 = 0; + width1 = buffer->Width; + height1 = buffer->Height; + } else { + x1 = x; + y1 = Y_FLIP(y+height-1); + width1 = width; + height1 = height; + } + /* XXX: Scissoring */ + + fprintf(stderr, "Clear\n"); + + /* Mask out any non-existent buffers */ + if (smesa->depth.offset == 0 || !ctx->Depth.Mask) + mask &= ~BUFFER_BIT_DEPTH; + + LOCK_HARDWARE(); + + if (mask & BUFFER_BIT_FRONT_LEFT) { + sis_clear_front_buffer(ctx, mask, x1, y1, width1, height1); + mask &= ~BUFFER_BIT_FRONT_LEFT; + } + + if (mask & BUFFER_BIT_BACK_LEFT) { + sis_clear_back_buffer(ctx, mask, x1, y1, width1, height1); + mask &= ~BUFFER_BIT_BACK_LEFT; + } + + if (mask & BUFFER_BIT_DEPTH) { + sis_clear_z_buffer(ctx, mask, x1, y1, width1, height1); + mask &= ~BUFFER_BIT_DEPTH; + } + + UNLOCK_HARDWARE(); + + if (mask != 0) + _swrast_Clear(ctx, mask, all, x1, y1, width, height); +} + + +void +sis6326DDClearColor(GLcontext *ctx, const GLfloat color[4]) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + GLubyte c[4]; + + CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]); + CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]); + CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]); + CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]); + + set_color_pattern( smesa, c[0], c[1], c[2], c[3] ); +} + +void +sis6326DDClearDepth(GLcontext *ctx, GLclampd d) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + sis6326UpdateZPattern(smesa, d); +} + +static void +sis_clear_back_buffer(GLcontext *ctx, GLenum mask, GLint x, GLint y, + GLint width, GLint height) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + /* XXX: The order of writing these registers seems to matter, while + * it actually shouldn't. + */ + mWait3DCmdQueue(6); + MMIO(REG_6326_BitBlt_DstSrcPitch, smesa->back.pitch << 16); + MMIO(REG_6326_BitBlt_fgColor, SiS_ROP_PATCOPY | + smesa->clearColorPattern); + MMIO(REG_6326_BitBlt_bgColor, SiS_ROP_PATCOPY | + smesa->clearColorPattern); + MMIO(REG_6326_BitBlt_DstAddr, smesa->back.offset + + (y+height) * smesa->back.pitch + + (x+width) * smesa->bytesPerPixel); + MMIO(REG_6326_BitBlt_HeightWidth, ((height-1) << 16) | + (width * smesa->bytesPerPixel)); + MMIO_WMB(); + MMIO(REG_6326_BitBlt_Cmd, BLT_PAT_BG); +} + +static void +sis_clear_front_buffer(GLcontext *ctx, GLenum mask, GLint x, GLint y, + GLint width, GLint height) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + int count; + drm_clip_rect_t *pExtents = NULL; + + pExtents = smesa->driDrawable->pClipRects; + count = smesa->driDrawable->numClipRects; + + mWait3DCmdQueue(3); + MMIO(REG_6326_BitBlt_DstSrcPitch, smesa->front.pitch << 16); + MMIO(REG_6326_BitBlt_fgColor, SiS_ROP_PATCOPY | + smesa->clearColorPattern); + MMIO(REG_6326_BitBlt_bgColor, SiS_ROP_PATCOPY | + smesa->clearColorPattern); + + while (count--) { + GLint x1 = pExtents->x1 - smesa->driDrawable->x; + GLint y1 = pExtents->y1 - smesa->driDrawable->y; + GLint x2 = pExtents->x2 - smesa->driDrawable->x; + GLint y2 = pExtents->y2 - smesa->driDrawable->y; + + if (x > x1) + x1 = x; + if (y > y1) + y1 = y; + + if (x + width < x2) + x2 = x + width; + if (y + height < y2) + y2 = y + height; + width = x2 - x1; + height = y2 - y1; + + pExtents++; + + if (width <= 0 || height <= 0) + continue; + + mWait3DCmdQueue(3); + MMIO(REG_6326_BitBlt_DstAddr, smesa->front.offset + + (y2-1) * smesa->front.pitch + x2 * smesa->bytesPerPixel); + MMIO(REG_6326_BitBlt_HeightWidth, ((height-1) << 16) | + (width * smesa->bytesPerPixel)); + MMIO_WMB(); + MMIO(REG_6326_BitBlt_Cmd, BLT_PAT_BG); + } +} + +static void +sis_clear_z_buffer(GLcontext * ctx, GLbitfield mask, GLint x, GLint y, + GLint width, GLint height) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + mWait3DCmdQueue(6); + MMIO(REG_6326_BitBlt_DstAddr, + smesa->depth.offset + y * smesa->depth.pitch + x * 2); + MMIO(REG_6326_BitBlt_DstSrcPitch, smesa->depth.pitch << 16); + MMIO(REG_6326_BitBlt_HeightWidth, ((height-1) << 16) | (width * 2)); + MMIO(REG_6326_BitBlt_fgColor, SiS_ROP_PATCOPY | smesa->clearZStencilPattern); + MMIO(REG_6326_BitBlt_bgColor, SiS_ROP_PATCOPY | smesa->clearZStencilPattern); + MMIO_WMB(); + MMIO(REG_6326_BitBlt_Cmd, BLT_PAT_BG | BLT_XINC | BLT_YINC); +} + diff --git a/src/mesa/drivers/dri/sis/sis6326_reg.h b/src/mesa/drivers/dri/sis/sis6326_reg.h new file mode 100644 index 00000000000..8e645f0799c --- /dev/null +++ b/src/mesa/drivers/dri/sis/sis6326_reg.h @@ -0,0 +1,408 @@ +/* + * Copyright 2005 Eric Anholt + * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS 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: + * Eric Anholt <[email protected]> + * + */ + +#ifndef _sis6326_reg_h_ +#define _sis6326_reg_h_ + +#define REG_6326_BitBlt_SrcAddr 0x8280 +#define REG_6326_BitBlt_DstAddr 0x8284 +#define REG_6326_BitBlt_DstSrcPitch 0x8288 +#define REG_6326_BitBlt_HeightWidth 0x828c +#define REG_6326_BitBlt_fgColor 0x8290 +#define REG_6326_BitBlt_bgColor 0x8294 +#define REG_6326_BitBlt_Mask30 0x8298 +#define REG_6326_BitBlt_Mask74 0x829c +#define REG_6326_BitBlt_ClipTopLeft 0x82a0 +#define REG_6326_BitBlt_ClitBottomRight 0x82a4 +#define REG_6326_BitBlt_Cmd 0x82a8 +#define REG_6326_BitBlt_Pat 0x82ac + +#define REG_6326_3D_TSFSa 0x8800 +#define REG_6326_3D_TSZa 0x8804 +#define REG_6326_3D_TSXa 0x8808 +#define REG_6326_3D_TSYa 0x880C +#define REG_6326_3D_TSARGBa 0x8810 +#define REG_6326_3D_TSUa 0x8814 +#define REG_6326_3D_TSVa 0x8818 +#define REG_6326_3D_TSWa 0x881C + +#define REG_6326_3D_TSFSb 0x8820 +#define REG_6326_3D_TSZb 0x8824 +#define REG_6326_3D_TSXb 0x8828 +#define REG_6326_3D_TSYb 0x882C +#define REG_6326_3D_TSARGBb 0x8830 +#define REG_6326_3D_TSUb 0x8834 +#define REG_6326_3D_TSVb 0x8838 +#define REG_6326_3D_TSWb 0x883C + +#define REG_6326_3D_TSFSc 0x8840 +#define REG_6326_3D_TSZc 0x8844 +#define REG_6326_3D_TSXc 0x8848 +#define REG_6326_3D_TSYc 0x884C +#define REG_6326_3D_TSARGBc 0x8850 +#define REG_6326_3D_TSUc 0x8854 +#define REG_6326_3D_TSVc 0x8858 +#define REG_6326_3D_TSWc 0x885C + +#define REG_6326_3D_TEnable 0x8A00 +#define REG_6326_3D_ZSet 0x8A04 +#define REG_6326_3D_ZAddress 0x8A08 + +#define REG_6326_3D_AlphaSet 0x8A0C +#define REG_6326_3D_AlphaAddress 0x8A10 +#define REG_6326_3D_DstSet 0x8A14 +#define REG_6326_3D_DstAddress 0x8A18 +#define REG_6326_3D_LinePattern 0x8A1C +#define REG_6326_3D_FogSet 0x8A20 + +#define REG_6326_3D_DstSrcBlendMode 0x8A28 + +#define REG_6326_3D_ClipTopBottom 0x8A30 +#define REG_6326_3D_ClipLeftRight 0x8A34 + +#define REG_6326_3D_TextureSet 0x8A38 +#define REG_6326_3D_TextureBlendSet 0x8A3C +/* Low transparency value is in TextureBlendSet */ +#define REG_6326_3D_TextureTransparencyColorHigh 0x8A40 + +#define REG_6326_3D_TextureAddress0 0x8A44 +#define REG_6326_3D_TextureAddress1 0x8A48 +#define REG_6326_3D_TextureAddress2 0x8A4C +#define REG_6326_3D_TextureAddress3 0x8A50 +#define REG_6326_3D_TextureAddress4 0x8A54 +#define REG_6326_3D_TextureAddress5 0x8A58 +#define REG_6326_3D_TextureAddress6 0x8A5C +#define REG_6326_3D_TextureAddress7 0x8A60 +#define REG_6326_3D_TextureAddress8 0x8A64 +#define REG_6326_3D_TextureAddress9 0x8A68 + +#define REG_6326_3D_TexturePitch01 0x8A6C +#define REG_6326_3D_TexturePitch23 0x8A70 +#define REG_6326_3D_TexturePitch45 0x8A74 +#define REG_6326_3D_TexturePitch67 0x8A78 +#define REG_6326_3D_TexturePitch89 0x8A7C + +#define REG_6326_3D_TextureWidthHeight 0x8A80 +#define REG_6326_3D_TextureBorderColor 0x8A90 + +#define REG_6326_3D_EndPrimitiveList 0x8Aff + +/* + * REG_6326_BitBlt_fgColor (0x8290-0x8293) + * REG_6326_BitBlt_bgColor (0x8294-0x8297) + */ +#define MASK_BltRop 0xff000000 +#define MASK_BltColor 0x00ffffff + +#define SiS_ROP_SRCCOPY 0xcc000000 +#define SiS_ROP_PATCOPY 0xf0000000 + +/* + * REG_6326_BitBlt_Cmd (0x82a8-0x82ab) + */ +#define MASK_QueueStatus 0x0000ffff +#define MASK_BltCmd0 0x00ff0000 +#define MASK_BltCmd1 0xff000000 + +#define BLT_SRC_BG 0x00000000 +#define BLT_SRC_FG 0x00010000 +#define BLT_SRC_VID 0x00020000 +#define BLT_SRC_CPU 0x00030000 +#define BLT_PAT_BG 0x00000000 +#define BLT_PAT_FG 0x00040000 +#define BLT_PAT_PAT 0x000b0000 +#define BLT_XINC 0x00100000 +#define BLT_YINC 0x00200000 +#define BLT_CLIP 0x00400000 +#define BLT_BUSY 0x04000000 + +/* + * REG_3D_PrimitiveSet -- Define Fire Primitive Mask (89F8h-89FBh) + */ +#define MASK_6326_DrawPrimitiveCommand 0x00000007 +#define MASK_6326_SetFirePosition 0x00000F00 +#define MASK_6326_ShadingMode 0x001c0000 +#define MASK_6326_Direction 0x0003f000 + +/* OP_3D_{POINT,LINE,TRIANGLE}_DRAW same as 300-series */ +/* OP_3D_DIRECTION*_ same as 300-series */ + +#define OP_6326_3D_FIRE_TFIRE 0x00000000 +#define OP_6326_3D_FIRE_TSARGBa 0x00000100 +#define OP_6326_3D_FIRE_TSWa 0x00000200 +#define OP_6326_3D_FIRE_TSARGBb 0x00000300 +#define OP_6326_3D_FIRE_TSWb 0x00000400 +#define OP_6326_3D_FIRE_TSARGBc 0x00000500 +#define OP_6326_3D_FIRE_TSWc 0x00000600 +#define OP_6326_3D_FIRE_TSVc 0x00000700 + +#define OP_6326_3D_ATOP 0x00000000 +#define OP_6326_3D_BTOP 0x00010000 +#define OP_6326_3D_CTOP 0x00020000 +#define OP_6326_3D_AMID 0x00000000 +#define OP_6326_3D_BMID 0x00004000 +#define OP_6326_3D_CMID 0x00008000 +#define OP_6326_3D_ABOT 0x00000000 +#define OP_6326_3D_BBOT 0x00001000 +#define OP_6326_3D_CBOT 0x00002000 + +#define OP_6326_3D_SHADE_FLAT_TOP 0x00040000 +#define OP_6326_3D_SHADE_FLAT_MID 0x00080000 +#define OP_6326_3D_SHADE_FLAT_BOT 0x000c0000 +#define OP_6326_3D_SHADE_FLAT_GOURAUD 0x00100000 + + +/* + * REG_6326_3D_EngineFire + */ +#define MASK_CmdQueueLen 0x0FFF0000 +#define ENG_3DIDLEQE 0x00000002 +#define ENG_3DIDLE 0x00000001 + +/* + * REG_6326_3D_TEnable -- Define Capility Enable Mask (8A00h-8A03h) + */ +#define S_ENABLE_Dither (1 << 0) +#define S_ENABLE_Transparency (1 << 1) +#define S_ENABLE_Blend (1 << 2) +#define S_ENABLE_Fog (1 << 3) +#define S_ENABLE_Specular (1 << 4) +#define S_ENABLE_LargeCache (1 << 5) +#define S_ENABLE_TextureCache (1 << 7) +#define S_ENABLE_TextureTransparency (1 << 8) +#define S_ENABLE_TexturePerspective (1 << 9) +#define S_ENABLE_Texture (1 << 10) +#define S_ENABLE_PrimSetup (1 << 11) +#define S_ENABLE_LinePattern (1 << 12) +#define S_ENABLE_StippleAlpha (1 << 13) /* requires S_ENABLE_Stipple */ +#define S_ENABLE_Stipple (1 << 14) +#define S_ENABLE_AlphaBuffer (1 << 16) +#define S_ENABLE_AlphaTest (1 << 17) +#define S_ENABLE_AlphaWrite (1 << 18) +#define S_ENABLE_ZTest (1 << 20) +#define S_ENABLE_ZWrite (1 << 21) + +/* + * REG_3D_ZSet -- Define Z Buffer Setting Mask (8A08h-8A0Bh) + */ +#define MASK_6326_ZBufferPitch 0x00003FFF +#define MASK_6326_ZTestMode 0x00070000 +#define MASK_6326_ZBufferFormat 0x00100000 + +#define S_ZSET_FORMAT_8 0x00000000 +#define S_ZSET_FORMAT_16 0x00100000 + +#define S_ZSET_PASS_NEVER 0x00000000 +#define S_ZSET_PASS_LESS 0x00010000 +#define S_ZSET_PASS_EQUAL 0x00020000 +#define S_ZSET_PASS_LEQUAL 0x00030000 +#define S_ZSET_PASS_GREATER 0x00040000 +#define S_ZSET_PASS_NOTEQUAL 0x00050000 +#define S_ZSET_PASS_GEQUAL 0x00060000 +#define S_ZSET_PASS_ALWAYS 0x00070000 + +/* + * REG_3D_AlphaSet -- Define Alpha Buffer Setting Mask (8A0Ch-8A0Fh) + */ +#define MASK_AlphaBufferPitch 0x000003FF +#define MASK_AlphaRefValue 0x00FF0000 +#define MASK_AlphaTestMode 0x07000000 +#define MASK_AlphaBufferFormat 0x30000000 + +#define S_ASET_FORMAT_8 0x30000000 + +#define S_ASET_PASS_NEVER 0x00000000 +#define S_ASET_PASS_LESS 0x01000000 +#define S_ASET_PASS_EQUAL 0x02000000 +#define S_ASET_PASS_LEQUAL 0x03000000 +#define S_ASET_PASS_GREATER 0x04000000 +#define S_ASET_PASS_NOTEQUAL 0x05000000 +#define S_ASET_PASS_GEQUAL 0x06000000 +#define S_ASET_PASS_ALWAYS 0x07000000 + +/* + * REG_3D_DstSet -- Define Destination Buffer Setting Mask (8A14h-8A17h) + */ +/* pitch, format, depth, rgborder, rop bits same as 300-series */ + +/* + * REG_6326_3D_FogSet -- Define Fog Mask (8A20h-8A23h) + */ +#define MASK_6326_FogColor 0x00FFFFFF +#define MASK_6326_FogMode 0x01000000 + +#define FOGMODE_6326_CONST 0x00000000 +#define FOGMODE_6326_LINEAR 0x01000000 + +/* + * REG_6326_3D_DstSrcBlendMode (0x8A28 - 0x8A2B) + */ +#define MASK_6326_SrcBlendMode 0xf0000000 +#define MASK_6326_DstBlendMode 0x0f000000 +#define MASK_6326_TransparencyColor 0x00ffffff + +#define S_DBLEND_ZERO 0x00000000 +#define S_DBLEND_ONE 0x10000000 +#define S_DBLEND_SRC_COLOR 0x20000000 +#define S_DBLEND_INV_SRC_COLOR 0x30000000 +#define S_DBLEND_SRC_ALPHA 0x40000000 +#define S_DBLEND_INV_SRC_ALPHA 0x50000000 +#define S_DBLEND_DST_ALPHA 0x60000000 +#define S_DBLEND_INV_DST_ALPHA 0x70000000 + +#define S_SBLEND_ZERO 0x00000000 +#define S_SBLEND_ONE 0x01000000 +#define S_SBLEND_SRC_ALPHA 0x04000000 +#define S_SBLEND_INV_SRC_ALPHA 0x05000000 +#define S_SBLEND_DST_ALPHA 0x06000000 +#define S_SBLEND_INV_DST_ALPHA 0x07000000 +#define S_SBLEND_DST_COLOR 0x08000000 +#define S_SBLEND_INV_DST_COLOR 0x09000000 +#define S_SBLEND_SRC_ALPHA_SAT 0x0A000000 +#define S_SBLEND_BOTH_SRC_ALPHA 0x0B000000 +#define S_SBLEND_BOTH_INV_SRC_ALPHA 0x0C000000 + +/* + * REG_6326_3D_TextureSet (0x8A38 - 0x8A3B) + */ +#define MASK_6326_TextureMinFilter 0x00000007 +#define MASK_6326_TextureMagFilter 0x00000008 +#define MASK_6326_ClearTexCache 0x00000010 +#define MASK_6326_TextureInSystem 0x00000020 +#define MASK_6326_TextureLevel 0x00000F00 +#define MASK_6326_TextureSignYUVFormat 0x00008000 +#define MASK_6326_TextureMappingMode 0x00FF0000 + +#define TEXEL_6326_BGR_ORDER 0x80000000 + +#define TEXEL_6326_INDEX1 0x00000000 +#define TEXEL_6326_INDEX2 0x01000000 +#define TEXEL_6326_INDEX4 0x02000000 + +#define TEXEL_6326_M4 0x10000000 +#define TEXEL_6326_AM44 0x16000000 + +#define TEXEL_6326_YUV422 0x20000000 /* YUYV */ +#define TEXEL_6326_YVU422 0x21000000 /* YVYU */ +#define TEXEL_6326_UVY422 0x22000000 /* UYVY */ +#define TEXEL_6326_VUY422 0x23000000 /* VYUY */ + +#define TEXEL_6326_L1 0x30000000 +#define TEXEL_6326_L2 0x31000000 +#define TEXEL_6326_L4 0x32000000 +#define TEXEL_6326_L8 0x33000000 + +#define TEXEL_6326_AL22 0x35000000 +#define TEXEL_6326_AL44 0x38000000 +#define TEXEL_6326_AL88 0x3c000000 + +#define TEXEL_6326_RGB_332_8 0x40000000 +#define TEXEL_6326_RGB_233_8 0x41000000 +#define TEXEL_6326_RGB_232_8 0x42000000 +#define TEXEL_6326_ARGB_1232_8 0x43000000 + +#define TEXEL_6326_RGB_555_16 0x50000000 +#define TEXEL_6326_RGB_565_16 0x51000000 +#define TEXEL_6326_ARGB_1555_16 0x52000000 +#define TEXEL_6326_ARGB_4444_16 0x53000000 +#define TEXEL_6326_ARGB_8332_16 0x54000000 +#define TEXEL_6326_ARGB_8233_16 0x55000000 +#define TEXEL_6326_ARGB_8232_16 0x56000000 + +#define TEXEL_6326_ARGB_8565_24 0x63000000 +#define TEXEL_6326_ARGB_8555_24 0x67000000 +#define TEXEL_6326_RGB_888_24 0x68000000 + +#define TEXEL_6326_ARGB_8888_32 0x73000000 +#define TEXEL_6326_ARGB_0888_32 0x74000000 + +#define TEX_MAP_WRAP_U 0x00010000 +#define TEX_MAP_WRAP_V 0x00020000 +#define TEX_MAP_MIRROR_U 0x00040000 +#define TEX_MAP_MIRROR_V 0x00080000 +#define TEX_MAP_CLAMP_U 0x00100000 +#define TEX_MAP_CLAMP_V 0x00200000 +#define TEX_MAP_USE_CTB_SMOOTH 0x00400000 +#define TEX_MAP_USE_CTB 0x00800000 + +#define TEX_FILTER_NEAREST 0x00000000 +#define TEX_FILTER_LINEAR 0x00000001 +#define TEX_FILTER_NEAREST_MIP_NEAREST 0x00000002 +#define TEX_FILTER_NEAREST_MIP_LINEAR 0x00000003 +#define TEX_FILTER_LINEAR_MIP_NEAREST 0x00000004 +#define TEX_FILTER_LINEAR_MIP_LINEAR 0x00000005 +#define TEX_FILTER_MAG_NEAREST 0x00000000 +#define TEX_FILTER_MAG_LINEAR 0x00000008 + +/* + * REG_6326_3D_TextureBlendSet (0x8A3C - 0x8A3F) + */ +#define MASK_TextureTransparencyLowB 0x000000ff +#define MASK_TextureTransparencyLowG 0x0000FF00 +#define MASK_TextureTransparencyLowR 0x00ff0000 +#define MASK_TextureBlend 0x0f000000 + +#define TB_C_CS (0 << 26) +#define TB_C_CF (1 << 26) +#define TB_C_CFCS (2 << 26) /* also 3 << 26 */ +#define TB_C_CFOMAS_ASCS (4 << 26) +#define TB_C_CSOMAF_AFCF (6 << 26) /* also 7 << 26 */ + +#define TB_A_AS (0 << 24) +#define TB_A_AF (1 << 24) +#define TB_A_AFAS (1 << 24) + +/* + * REG_6326_3D_TextureTransparencyColorHigh (0x8A40 - 0x8A43) + */ +#define MASK_TextureTransparencyHighB 0x000000FF +#define MASK_TextureTransparencyHighG 0x0000FF00 +#define MASK_TextureTransparencyHighR 0x00FF0000 + +/* + * REG_3D_TexturePitch01-89 (0x8A6C - 0x8A7F) + */ +#define MASK_TexturePitchOdd 0x000003FF +#define MASK_TexturePitchEven 0x03FF0000 +#define SHIFT_TexturePitchEven 16 + +/* + * REG_3D_TextureWidthHeightMix (0x8A80 - 0x8A83) + */ +#define MASK_TextureWidthLog2 0xf0000000 +#define MASK_TextureHeightLog2 0x0f000000 + +/* + * REG_3D_TextureBorderColor (0x8A90 - 0x8A93) + */ +#define MASK_TextureBorderColorB 0x000000FF +#define MASK_TextureBorderColorG 0x0000FF00 +#define MASK_TextureBorderColorR 0x00FF0000 +#define MASK_TextureBorderColorA 0xFF000000 + +#endif /* _sis6326_reg_h_ */ diff --git a/src/mesa/drivers/dri/sis/sis6326_state.c b/src/mesa/drivers/dri/sis/sis6326_state.c new file mode 100644 index 00000000000..be229d019f5 --- /dev/null +++ b/src/mesa/drivers/dri/sis/sis6326_state.c @@ -0,0 +1,753 @@ +/* + * Copyright 2005 Eric Anholt + * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS 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: + * Eric Anholt <[email protected]> + * + */ + +#include "sis_context.h" +#include "sis_state.h" +#include "sis_tris.h" +#include "sis_lock.h" +#include "sis_tex.h" +#include "sis_reg.h" + +#include "context.h" +#include "enums.h" +#include "colormac.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" + +/* ============================================================= + * Alpha blending + */ + +static void +sis6326DDAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + GLubyte refbyte; + + __GLSiSHardware *prev = &smesa->prev; + __GLSiSHardware *current = &smesa->current; + + CLAMPED_FLOAT_TO_UBYTE(refbyte, ref); + current->hwAlpha = refbyte << 16; + + /* Alpha Test function */ + switch (func) + { + case GL_NEVER: + current->hwAlpha |= S_ASET_PASS_NEVER; + break; + case GL_LESS: + current->hwAlpha |= S_ASET_PASS_LESS; + break; + case GL_EQUAL: + current->hwAlpha |= S_ASET_PASS_EQUAL; + break; + case GL_LEQUAL: + current->hwAlpha |= S_ASET_PASS_LEQUAL; + break; + case GL_GREATER: + current->hwAlpha |= S_ASET_PASS_GREATER; + break; + case GL_NOTEQUAL: + current->hwAlpha |= S_ASET_PASS_NOTEQUAL; + break; + case GL_GEQUAL: + current->hwAlpha |= S_ASET_PASS_GEQUAL; + break; + case GL_ALWAYS: + current->hwAlpha |= S_ASET_PASS_ALWAYS; + break; + } + + prev->hwAlpha = current->hwAlpha; + smesa->GlobalFlag |= GFLAG_ALPHASETTING; +} + +static void +sis6326DDBlendFuncSeparate( GLcontext *ctx, + GLenum sfactorRGB, GLenum dfactorRGB, + GLenum sfactorA, GLenum dfactorA ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + __GLSiSHardware *prev = &smesa->prev; + __GLSiSHardware *current = &smesa->current; + + current->hwDstSrcBlend = 0; + + switch (dfactorRGB) + { + case GL_ZERO: + current->hwDstSrcBlend |= S_DBLEND_ZERO; + break; + case GL_ONE: + current->hwDstSrcBlend |= S_DBLEND_ONE; + break; + case GL_SRC_COLOR: + current->hwDstSrcBlend |= S_DBLEND_SRC_COLOR; + break; + case GL_ONE_MINUS_SRC_COLOR: + current->hwDstSrcBlend |= S_DBLEND_INV_SRC_COLOR; + break; + case GL_SRC_ALPHA: + current->hwDstSrcBlend |= S_DBLEND_SRC_ALPHA; + break; + case GL_ONE_MINUS_SRC_ALPHA: + current->hwDstSrcBlend |= S_DBLEND_INV_SRC_ALPHA; + break; + case GL_DST_ALPHA: + current->hwDstSrcBlend |= S_DBLEND_DST_ALPHA; + break; + case GL_ONE_MINUS_DST_ALPHA: + current->hwDstSrcBlend |= S_DBLEND_INV_DST_ALPHA; + break; + } + + switch (sfactorRGB) + { + case GL_ZERO: + current->hwDstSrcBlend |= S_SBLEND_ZERO; + break; + case GL_ONE: + current->hwDstSrcBlend |= S_SBLEND_ONE; + break; + case GL_SRC_ALPHA: + current->hwDstSrcBlend |= S_SBLEND_SRC_ALPHA; + break; + case GL_ONE_MINUS_SRC_ALPHA: + current->hwDstSrcBlend |= S_SBLEND_INV_SRC_ALPHA; + break; + case GL_DST_ALPHA: + current->hwDstSrcBlend |= S_SBLEND_DST_ALPHA; + break; + case GL_ONE_MINUS_DST_ALPHA: + current->hwDstSrcBlend |= S_SBLEND_INV_DST_ALPHA; + break; + case GL_DST_COLOR: + current->hwDstSrcBlend |= S_SBLEND_DST_COLOR; + break; + case GL_ONE_MINUS_DST_COLOR: + current->hwDstSrcBlend |= S_SBLEND_INV_DST_COLOR; + break; + case GL_SRC_ALPHA_SATURATE: + current->hwDstSrcBlend |= S_SBLEND_SRC_ALPHA_SAT; + break; + } + + if (current->hwDstSrcBlend != prev->hwDstSrcBlend) { + prev->hwDstSrcBlend = current->hwDstSrcBlend; + smesa->GlobalFlag |= GFLAG_DSTBLEND; + } +} + +/* ============================================================= + * Depth testing + */ + +static void +sis6326DDDepthFunc( GLcontext *ctx, GLenum func ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + __GLSiSHardware *prev = &smesa->prev; + __GLSiSHardware *current = &smesa->current; + + current->hwZ &= ~MASK_6326_ZTestMode; + switch (func) + { + case GL_LESS: + current->hwZ |= S_ZSET_PASS_LESS; + break; + case GL_GEQUAL: + current->hwZ |= S_ZSET_PASS_GEQUAL; + break; + case GL_LEQUAL: + current->hwZ |= S_ZSET_PASS_LEQUAL; + break; + case GL_GREATER: + current->hwZ |= S_ZSET_PASS_GREATER; + break; + case GL_NOTEQUAL: + current->hwZ |= S_ZSET_PASS_NOTEQUAL; + break; + case GL_EQUAL: + current->hwZ |= S_ZSET_PASS_EQUAL; + break; + case GL_ALWAYS: + current->hwZ |= S_ZSET_PASS_ALWAYS; + break; + case GL_NEVER: + current->hwZ |= S_ZSET_PASS_NEVER; + break; + } + + if (current->hwZ != prev->hwZ) { + prev->hwZ = current->hwZ; + smesa->GlobalFlag |= GFLAG_ZSETTING; + } +} + +static void +sis6326DDDepthMask( GLcontext *ctx, GLboolean flag ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + __GLSiSHardware *current = &smesa->current; + + if (ctx->Depth.Test) + current->hwCapEnable |= S_ENABLE_ZWrite; + else + current->hwCapEnable &= ~S_ENABLE_ZWrite; +} + +/* ============================================================= + * Fog + */ + +static void +sis6326DDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *params ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + __GLSiSHardware *current = &smesa->current; + __GLSiSHardware *prev = &smesa->prev; + + GLint fogColor; + + switch(pname) + { + case GL_FOG_COLOR: + fogColor = FLOAT_TO_UBYTE( ctx->Fog.Color[0] ) << 16; + fogColor |= FLOAT_TO_UBYTE( ctx->Fog.Color[1] ) << 8; + fogColor |= FLOAT_TO_UBYTE( ctx->Fog.Color[2] ); + current->hwFog = 0x01000000 | fogColor; + if (current->hwFog != prev->hwFog) { + prev->hwFog = current->hwFog; + smesa->GlobalFlag |= GFLAG_FOGSETTING; + } + break; + } +} + +/* ============================================================= + * Clipping + */ + +void +sis6326UpdateClipping(GLcontext *ctx) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + __GLSiSHardware *prev = &smesa->prev; + __GLSiSHardware *current = &smesa->current; + + GLint x1, y1, x2, y2; + + x1 = 0; + y1 = 0; + x2 = smesa->width - 1; + y2 = smesa->height - 1; + + if (ctx->Scissor.Enabled) { + if (ctx->Scissor.X > x1) + x1 = ctx->Scissor.X; + if (ctx->Scissor.Y > y1) + y1 = ctx->Scissor.Y; + if (ctx->Scissor.X + ctx->Scissor.Width - 1 < x2) + x2 = ctx->Scissor.X + ctx->Scissor.Width - 1; + if (ctx->Scissor.Y + ctx->Scissor.Height - 1 < y2) + y2 = ctx->Scissor.Y + ctx->Scissor.Height - 1; + } + + y1 = Y_FLIP(y1); + y2 = Y_FLIP(y2); + + /*current->clipTopBottom = (y2 << 13) | y1; + current->clipLeftRight = (x1 << 13) | x2;*/ /* XXX */ + current->clipTopBottom = (0 << 13) | smesa->height; + current->clipLeftRight = (0 << 13) | smesa->width; + + if ((current->clipTopBottom != prev->clipTopBottom) || + (current->clipLeftRight != prev->clipLeftRight)) { + prev->clipTopBottom = current->clipTopBottom; + prev->clipLeftRight = current->clipLeftRight; + smesa->GlobalFlag |= GFLAG_CLIPPING; + } +} + +static void +sis6326DDScissor( GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h ) +{ + if (ctx->Scissor.Enabled) + sis6326UpdateClipping( ctx ); +} + +/* ============================================================= + * Culling + */ + +static void +sis6326UpdateCull( GLcontext *ctx ) +{ + /* XXX culling */ +} + + +static void +sis6326DDCullFace( GLcontext *ctx, GLenum mode ) +{ + sis6326UpdateCull( ctx ); +} + +static void +sis6326DDFrontFace( GLcontext *ctx, GLenum mode ) +{ + sis6326UpdateCull( ctx ); +} + +/* ============================================================= + * Masks + */ + +static void sis6326DDColorMask( GLcontext *ctx, + GLboolean r, GLboolean g, + GLboolean b, GLboolean a ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + if (r && g && b && ((ctx->Visual.alphaBits == 0) || a)) { + FALLBACK(smesa, SIS_FALLBACK_WRITEMASK, 0); + } else { + FALLBACK(smesa, SIS_FALLBACK_WRITEMASK, 1); + } +} + +/* ============================================================= + * Rendering attributes + */ + +static void sis6326UpdateSpecular(GLcontext *ctx) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + __GLSiSHardware *current = &smesa->current; + + if (NEED_SECONDARY_COLOR(ctx)) + current->hwCapEnable |= S_ENABLE_Specular; + else + current->hwCapEnable &= ~S_ENABLE_Specular; +} + +static void sis6326DDLightModelfv(GLcontext *ctx, GLenum pname, + const GLfloat *param) +{ + if (pname == GL_LIGHT_MODEL_COLOR_CONTROL) { + sis6326UpdateSpecular(ctx); + } +} +static void sis6326DDShadeModel( GLcontext *ctx, GLenum mode ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + /* Signal to sisRasterPrimitive to recalculate dwPrimitiveSet */ + smesa->hw_primitive = -1; +} + +/* ============================================================= + * Window position + */ + +/* ============================================================= + * Viewport + */ + +static void sis6326CalcViewport( GLcontext *ctx ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + const GLfloat *v = ctx->Viewport._WindowMap.m; + GLfloat *m = smesa->hw_viewport; + + /* See also sis_translate_vertex. + */ + m[MAT_SX] = v[MAT_SX]; + m[MAT_TX] = v[MAT_TX] + SUBPIXEL_X; + m[MAT_SY] = - v[MAT_SY]; + m[MAT_TY] = - v[MAT_TY] + smesa->driDrawable->h + SUBPIXEL_Y; + m[MAT_SZ] = v[MAT_SZ] * smesa->depth_scale; + m[MAT_TZ] = v[MAT_TZ] * smesa->depth_scale; +} + +static void sis6326DDViewport( GLcontext *ctx, + GLint x, GLint y, + GLsizei width, GLsizei height ) +{ + sis6326CalcViewport( ctx ); +} + +static void sis6326DDDepthRange( GLcontext *ctx, + GLclampd nearval, GLclampd farval ) +{ + sis6326CalcViewport( ctx ); +} + +/* ============================================================= + * Miscellaneous + */ + +static void +sis6326DDLogicOpCode( GLcontext *ctx, GLenum opcode ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + __GLSiSHardware *prev = &smesa->prev; + __GLSiSHardware *current = &smesa->current; + + if (!ctx->Color.ColorLogicOpEnabled) + return; + + current->hwDstSet &= ~MASK_ROP2; + switch (opcode) + { + case GL_CLEAR: + current->hwDstSet |= LOP_CLEAR; + break; + case GL_SET: + current->hwDstSet |= LOP_SET; + break; + case GL_COPY: + current->hwDstSet |= LOP_COPY; + break; + case GL_COPY_INVERTED: + current->hwDstSet |= LOP_COPY_INVERTED; + break; + case GL_NOOP: + current->hwDstSet |= LOP_NOOP; + break; + case GL_INVERT: + current->hwDstSet |= LOP_INVERT; + break; + case GL_AND: + current->hwDstSet |= LOP_AND; + break; + case GL_NAND: + current->hwDstSet |= LOP_NAND; + break; + case GL_OR: + current->hwDstSet |= LOP_OR; + break; + case GL_NOR: + current->hwDstSet |= LOP_NOR; + break; + case GL_XOR: + current->hwDstSet |= LOP_XOR; + break; + case GL_EQUIV: + current->hwDstSet |= LOP_EQUIV; + break; + case GL_AND_REVERSE: + current->hwDstSet |= LOP_AND_REVERSE; + break; + case GL_AND_INVERTED: + current->hwDstSet |= LOP_AND_INVERTED; + break; + case GL_OR_REVERSE: + current->hwDstSet |= LOP_OR_REVERSE; + break; + case GL_OR_INVERTED: + current->hwDstSet |= LOP_OR_INVERTED; + break; + } + + if (current->hwDstSet != prev->hwDstSet) { + prev->hwDstSet = current->hwDstSet; + smesa->GlobalFlag |= GFLAG_DESTSETTING; + } +} + +void sis6326DDDrawBuffer( GLcontext *ctx, GLenum mode ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + __GLSiSHardware *prev = &smesa->prev; + __GLSiSHardware *current = &smesa->current; + + if(getenv("SIS_DRAW_FRONT")) + ctx->DrawBuffer->_ColorDrawBufferMask[0] = GL_FRONT_LEFT; + + /* + * _DrawDestMask is easier to cope with than <mode>. + */ + current->hwDstSet &= ~MASK_DstBufferPitch; + switch ( ctx->DrawBuffer->_ColorDrawBufferMask[0] ) { + case BUFFER_BIT_FRONT_LEFT: + current->hwOffsetDest = smesa->front.offset; + current->hwDstSet |= smesa->front.pitch; + FALLBACK( smesa, SIS_FALLBACK_DRAW_BUFFER, GL_FALSE ); + break; + case BUFFER_BIT_BACK_LEFT: + current->hwOffsetDest = smesa->back.offset; + current->hwDstSet |= smesa->back.pitch; + FALLBACK( smesa, SIS_FALLBACK_DRAW_BUFFER, GL_FALSE ); + break; + default: + /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */ + FALLBACK( smesa, SIS_FALLBACK_DRAW_BUFFER, GL_TRUE ); + return; + } + + if (current->hwDstSet != prev->hwDstSet) { + prev->hwDstSet = current->hwDstSet; + smesa->GlobalFlag |= GFLAG_DESTSETTING; + } + + if (current->hwOffsetDest != prev->hwOffsetDest) { + prev->hwOffsetDest = current->hwOffsetDest; + smesa->GlobalFlag |= GFLAG_DESTSETTING; + } +} + +/* ============================================================= + * Polygon stipple + */ + +/* ============================================================= + * Render mode + */ + +/* ============================================================= + * State enable/disable + */ + +static void +sis6326DDEnable( GLcontext *ctx, GLenum cap, GLboolean state ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + __GLSiSHardware *current = &smesa->current; + + switch (cap) + { + case GL_ALPHA_TEST: + if (state) + current->hwCapEnable |= S_ENABLE_AlphaTest; + else + current->hwCapEnable &= ~S_ENABLE_AlphaTest; + break; + case GL_BLEND: + /* TODO: */ + if (state) + /* if (state & !ctx->Color.ColorLogicOpEnabled) */ + current->hwCapEnable |= S_ENABLE_Blend; + else + current->hwCapEnable &= ~S_ENABLE_Blend; + break; + case GL_CULL_FACE: + /* XXX culling */ + break; + case GL_DEPTH_TEST: + if (state && smesa->depth.offset != 0) + current->hwCapEnable |= S_ENABLE_ZTest; + else + current->hwCapEnable &= ~S_ENABLE_ZTest; + sis6326DDDepthMask( ctx, ctx->Depth.Mask ); + break; + case GL_DITHER: + if (state) + current->hwCapEnable |= S_ENABLE_Dither; + else + current->hwCapEnable &= ~S_ENABLE_Dither; + break; + case GL_FOG: + if (state) + current->hwCapEnable |= S_ENABLE_Fog; + else + current->hwCapEnable &= ~S_ENABLE_Fog; + break; + case GL_COLOR_LOGIC_OP: + if (state) + sis6326DDLogicOpCode( ctx, ctx->Color.LogicOp ); + else + sis6326DDLogicOpCode( ctx, GL_COPY ); + break; + case GL_SCISSOR_TEST: + sis6326UpdateClipping( ctx ); + break; + case GL_STENCIL_TEST: + if (state) { + FALLBACK(smesa, SIS_FALLBACK_STENCIL, 1); + } else { + FALLBACK(smesa, SIS_FALLBACK_STENCIL, 0); + } + break; + case GL_LIGHTING: + case GL_COLOR_SUM_EXT: + sis6326UpdateSpecular(ctx); + break; + } +} + +/* ============================================================= + * State initialization, management + */ + +/* Called before beginning of rendering. */ +void +sis6326UpdateHWState( GLcontext *ctx ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + __GLSiSHardware *prev = &smesa->prev; + __GLSiSHardware *current = &smesa->current; + + if (smesa->NewGLState & _NEW_TEXTURE) + sisUpdateTextureState( ctx ); + + if (current->hwCapEnable ^ prev->hwCapEnable) { + prev->hwCapEnable = current->hwCapEnable; + smesa->GlobalFlag |= GFLAG_ENABLESETTING; + } + + if (smesa->GlobalFlag & GFLAG_RENDER_STATES) + sis_update_render_state( smesa ); + + if (smesa->GlobalFlag & GFLAG_TEXTURE_STATES) + sis_update_texture_state( smesa ); +} + +static void +sis6326DDInvalidateState( GLcontext *ctx, GLuint new_state ) +{ + sisContextPtr smesa = SIS_CONTEXT(ctx); + + _swrast_InvalidateState( ctx, new_state ); + _swsetup_InvalidateState( ctx, new_state ); + _ac_InvalidateState( ctx, new_state ); + _tnl_InvalidateState( ctx, new_state ); + smesa->NewGLState |= new_state; +} + +/* Initialize the context's hardware state. + */ +void sis6326DDInitState( sisContextPtr smesa ) +{ + __GLSiSHardware *prev = &smesa->prev; + __GLSiSHardware *current = &smesa->current; + GLcontext *ctx = smesa->glCtx; + + /* add Texture Perspective Enable */ + current->hwCapEnable = S_ENABLE_TextureCache | + S_ENABLE_TexturePerspective | S_ENABLE_Dither; + + /* Z test mode is LESS */ + current->hwZ = S_ZSET_PASS_LESS | S_ZSET_FORMAT_16; + if (ctx->Visual.depthBits > 0) + current->hwCapEnable |= S_ENABLE_ZWrite; + + /* Alpha test mode is ALWAYS, alpha ref value is 0 */ + current->hwAlpha = S_ASET_PASS_ALWAYS; + + /* ROP2 is COPYPEN */ + current->hwDstSet = LOP_COPY; + + /* LinePattern is 0, Repeat Factor is 0 */ + current->hwLinePattern = 0x00008000; + + /* Src blend is BLEND_ONE, Dst blend is D3DBLEND_ZERO */ + current->hwDstSrcBlend = S_SBLEND_ONE | S_DBLEND_ZERO; + + switch (smesa->bytesPerPixel) + { + case 2: + current->hwDstSet |= DST_FORMAT_RGB_565; + break; + case 4: + current->hwDstSet |= DST_FORMAT_ARGB_8888; + break; + } + + smesa->depth_scale = 1.0 / (GLfloat)0xffff; + + smesa->clearTexCache = GL_TRUE; + + smesa->clearColorPattern = 0; + + sis6326UpdateZPattern(smesa, 1.0); + sis6326UpdateCull(ctx); + + /* Set initial fog settings. Start and end are the same case. */ + sis6326DDFogfv( ctx, GL_FOG_DENSITY, &ctx->Fog.Density ); + sis6326DDFogfv( ctx, GL_FOG_END, &ctx->Fog.End ); + sis6326DDFogfv( ctx, GL_FOG_MODE, NULL ); + + memcpy(prev, current, sizeof(__GLSiSHardware)); +} + +/* Initialize the driver's state functions. + */ +void sis6326DDInitStateFuncs( GLcontext *ctx ) +{ + ctx->Driver.UpdateState = sis6326DDInvalidateState; + + ctx->Driver.Clear = sis6326DDClear; + ctx->Driver.ClearColor = sis6326DDClearColor; + ctx->Driver.ClearDepth = sis6326DDClearDepth; + + ctx->Driver.AlphaFunc = sis6326DDAlphaFunc; + ctx->Driver.BlendFuncSeparate = sis6326DDBlendFuncSeparate; + ctx->Driver.ColorMask = sis6326DDColorMask; + ctx->Driver.CullFace = sis6326DDCullFace; + ctx->Driver.DepthMask = sis6326DDDepthMask; + ctx->Driver.DepthFunc = sis6326DDDepthFunc; + ctx->Driver.DepthRange = sis6326DDDepthRange; + ctx->Driver.DrawBuffer = sis6326DDDrawBuffer; + ctx->Driver.Enable = sis6326DDEnable; + ctx->Driver.FrontFace = sis6326DDFrontFace; + ctx->Driver.Fogfv = sis6326DDFogfv; + ctx->Driver.Hint = NULL; + ctx->Driver.Lightfv = NULL; + ctx->Driver.LogicOpcode = sis6326DDLogicOpCode; + ctx->Driver.PolygonMode = NULL; + ctx->Driver.PolygonStipple = NULL; + ctx->Driver.RenderMode = NULL; + ctx->Driver.Scissor = sis6326DDScissor; + ctx->Driver.ShadeModel = sis6326DDShadeModel; + ctx->Driver.LightModelfv = sis6326DDLightModelfv; + ctx->Driver.Viewport = sis6326DDViewport; + + /* Pixel path fallbacks. */ + ctx->Driver.Accum = _swrast_Accum; + ctx->Driver.Bitmap = _swrast_Bitmap; + ctx->Driver.CopyPixels = _swrast_CopyPixels; + ctx->Driver.DrawPixels = _swrast_DrawPixels; + ctx->Driver.ReadPixels = _swrast_ReadPixels; + + /* Swrast hooks for imaging extensions: */ + ctx->Driver.CopyColorTable = _swrast_CopyColorTable; + ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable; + ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; + ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; +} diff --git a/src/mesa/drivers/dri/sis/sis_context.c b/src/mesa/drivers/dri/sis/sis_context.c index af02643da1c..ebfc1f36ef0 100644 --- a/src/mesa/drivers/dri/sis/sis_context.c +++ b/src/mesa/drivers/dri/sis/sis_context.c @@ -86,6 +86,16 @@ struct dri_extension card_extensions[] = { NULL, NULL } }; +struct dri_extension card_extensions_6326[] = +{ + { "GL_ARB_multisample", GL_ARB_multisample_functions }, + /*{ "GL_ARB_texture_border_clamp", NULL },*/ + { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions }, + /*{ "GL_ARB_texture_mirrored_repeat", NULL },*/ + /*{ "GL_MESA_ycbcr_texture", NULL },*/ + { NULL, NULL } +}; + static const struct dri_debug_control debug_control[] = { { "fall", DEBUG_FALLBACKS }, @@ -97,9 +107,15 @@ WaitEngIdle (sisContextPtr smesa) { GLuint engineState; - do { - engineState = MMIO_READ(REG_CommandQueue); - } while ((engineState & SiS_EngIdle) != SiS_EngIdle); + if (smesa->is6326) { + do { + engineState = MMIO_READ(REG_3D_EngineFire); /* XXX right reg? */ + } while ((engineState & ENG_3DIDLEQE) != 0); + } else { + do { + engineState = MMIO_READ(REG_CommandQueue); + } while ((engineState & SiS_EngIdle) != SiS_EngIdle); + } } void @@ -107,9 +123,15 @@ Wait2DEngIdle (sisContextPtr smesa) { GLuint engineState; - do { - engineState = MMIO_READ(REG_CommandQueue); - } while ((engineState & SiS_EngIdle2d) != SiS_EngIdle2d); + if (smesa->is6326) { + do { + engineState = MMIO_READ(REG_6326_BitBlt_Cmd); + } while ((engineState & BLT_BUSY) != 0); + } else { + do { + engineState = MMIO_READ(REG_CommandQueue); + } while ((engineState & SiS_EngIdle2d) != SiS_EngIdle2d); + } } /* To be called from mWait3DCmdQueue. Separate function for profiling @@ -118,9 +140,16 @@ Wait2DEngIdle (sisContextPtr smesa) void WaitingFor3dIdle(sisContextPtr smesa, int wLen) { - while (*(smesa->CurrentQueueLenPtr) < wLen) { - *(smesa->CurrentQueueLenPtr) = - (MMIO_READ(REG_CommandQueue) & MASK_QueueLen) - 20; + if (smesa->is6326) { + while (*(smesa->CurrentQueueLenPtr) < wLen) { + *(smesa->CurrentQueueLenPtr) = + ((GLuint)MMIO_READ(REG_3D_EngineFire) >> 16) * 2; + } + } else { + while (*(smesa->CurrentQueueLenPtr) < wLen) { + *(smesa->CurrentQueueLenPtr) = + (MMIO_READ(REG_CommandQueue) & MASK_QueueLen) - 20; + } } } @@ -173,6 +202,7 @@ sisCreateContext( const __GLcontextModes *glVisual, sisScreen = smesa->sisScreen = (sisScreenPtr)(sPriv->private); + smesa->is6326 = GL_FALSE; /* XXX */ smesa->driContext = driContextPriv; smesa->driScreen = sPriv; smesa->driDrawable = NULL; @@ -214,6 +244,16 @@ sisCreateContext( const __GLcontextModes *glVisual, sis_fatal_error("Bad bytesPerPixel %d.\n", smesa->bytesPerPixel); } + if (smesa->is6326) { + ctx->Const.MaxTextureUnits = 1; + ctx->Const.MaxTextureLevels = 9; + } else { + ctx->Const.MaxTextureUnits = 2; + ctx->Const.MaxTextureLevels = 11; + } + ctx->Const.MaxTextureImageUnits = ctx->Const.MaxTextureUnits; + ctx->Const.MaxTextureCoordUnits = ctx->Const.MaxTextureUnits; + /* Parse configuration files */ driParseConfigFiles (&smesa->optionCache, &sisScreen->optionCache, sisScreen->driScreen->myNum, "sis"); @@ -274,11 +314,16 @@ sisCreateContext( const __GLcontextModes *glVisual, _tnl_allow_vertex_fog( ctx, GL_FALSE ); /* XXX these should really go right after _mesa_init_driver_functions() */ - sisDDInitStateFuncs( ctx ); - sisDDInitState( smesa ); /* Initializes smesa->zFormat, important */ + if (smesa->is6326) { + sis6326DDInitStateFuncs( ctx ); + sis6326DDInitState( smesa ); /* Initializes smesa->zFormat, important */ + } else { + sisDDInitStateFuncs( ctx ); + sisDDInitState( smesa ); /* Initializes smesa->zFormat, important */ + sisDDInitStencilFuncs( ctx ); + } sisInitTriFuncs( ctx ); sisDDInitSpanFuncs( ctx ); - sisDDInitStencilFuncs( ctx ); driInitExtensions( ctx, card_extensions, GL_FALSE ); @@ -553,3 +598,127 @@ sis_update_texture_state (sisContextPtr smesa) smesa->GlobalFlag &= ~GFLAG_TEXTURE_STATES; } +void +sis6326_update_render_state( sisContextPtr smesa ) +{ + __GLSiSHardware *prev = &smesa->prev; + + mWait3DCmdQueue (45); + + if (smesa->GlobalFlag & GFLAG_ENABLESETTING) { + if (!smesa->clearTexCache) { + MMIO(REG_6326_3D_TEnable, prev->hwCapEnable); + } else { + MMIO(REG_6326_3D_TEnable, prev->hwCapEnable & ~S_ENABLE_TextureCache); + MMIO(REG_6326_3D_TEnable, prev->hwCapEnable); + smesa->clearTexCache = GL_FALSE; + } + } + + /* Z Setting */ + if (smesa->GlobalFlag & GFLAG_ZSETTING) { + MMIO(REG_6326_3D_ZSet, prev->hwZ); + MMIO(REG_6326_3D_ZAddress, prev->hwOffsetZ); + } + + /* Alpha Setting */ + if (smesa->GlobalFlag & GFLAG_ALPHASETTING) + MMIO(REG_6326_3D_AlphaSet, prev->hwAlpha); + + if (smesa->GlobalFlag & GFLAG_DESTSETTING) { + MMIO(REG_6326_3D_DstSet, prev->hwDstSet); + MMIO(REG_6326_3D_DstAddress, prev->hwOffsetDest); + } + + /* Fog Setting */ + if (smesa->GlobalFlag & GFLAG_FOGSETTING) { + MMIO(REG_6326_3D_FogSet, prev->hwFog); + } + + /* Miscellaneous Setting */ + if (smesa->GlobalFlag & GFLAG_DSTBLEND) + MMIO(REG_6326_3D_DstSrcBlendMode, prev->hwDstSrcBlend); + + if (smesa->GlobalFlag & GFLAG_CLIPPING) { + MMIO(REG_6326_3D_ClipTopBottom, prev->clipTopBottom); + MMIO(REG_6326_3D_ClipLeftRight, prev->clipLeftRight); + } + + smesa->GlobalFlag &= ~GFLAG_RENDER_STATES; +} + +void +sis6326_update_texture_state (sisContextPtr smesa) +{ + __GLSiSHardware *prev = &smesa->prev; + + mWait3DCmdQueue (55); + if (smesa->clearTexCache || (smesa->GlobalFlag & GFLAG_TEXTUREADDRESS)) { + MMIO(REG_6326_3D_TEnable, prev->hwCapEnable & ~S_ENABLE_TextureCache); + MMIO(REG_6326_3D_TEnable, prev->hwCapEnable); + smesa->clearTexCache = GL_FALSE; + } + + /* Texture Setting */ + if (smesa->GlobalFlag & CFLAG_TEXTURERESET) + MMIO(REG_6326_3D_TextureSet, prev->texture[0].hwTextureSet); + + if (smesa->GlobalFlag & GFLAG_TEXTUREMIPMAP) + MMIO(REG_6326_3D_TextureWidthHeight, prev->texture[0].hwTexWidthHeight); + + /* + MMIO(REG_3D_TextureTransparencyColorHigh, prev->texture[0].hwTextureClrHigh); + MMIO(REG_3D_TextureTransparencyColorLow, prev->texture[0].hwTextureClrLow); + */ + + if (smesa->GlobalFlag & GFLAG_TEXBORDERCOLOR) + MMIO(REG_6326_3D_TextureBorderColor, prev->texture[0].hwTextureBorderColor); + + if (smesa->GlobalFlag & GFLAG_TEXTUREADDRESS) { + switch ((prev->texture[0].hwTextureSet & MASK_6326_TextureLevel) >> 8) + { + case 9: + MMIO(REG_6326_3D_TextureAddress9, prev->texture[0].texOffset9); + /* FALLTHROUGH */ + case 8: + MMIO(REG_6326_3D_TextureAddress8, prev->texture[0].texOffset8); + MMIO(REG_6326_3D_TexturePitch89, prev->texture[0].texPitch89); + /* FALLTHROUGH */ + case 7: + MMIO(REG_6326_3D_TextureAddress7, prev->texture[0].texOffset7); + /* FALLTHROUGH */ + case 6: + MMIO(REG_6326_3D_TextureAddress6, prev->texture[0].texOffset6); + MMIO(REG_6326_3D_TexturePitch67, prev->texture[0].texPitch67); + /* FALLTHROUGH */ + case 5: + MMIO(REG_6326_3D_TextureAddress5, prev->texture[0].texOffset5); + /* FALLTHROUGH */ + case 4: + MMIO(REG_6326_3D_TextureAddress4, prev->texture[0].texOffset4); + MMIO(REG_6326_3D_TexturePitch45, prev->texture[0].texPitch45); + /* FALLTHROUGH */ + case 3: + MMIO(REG_6326_3D_TextureAddress3, prev->texture[0].texOffset3); + /* FALLTHROUGH */ + case 2: + MMIO(REG_6326_3D_TextureAddress2, prev->texture[0].texOffset2); + MMIO(REG_6326_3D_TexturePitch23, prev->texture[0].texPitch23); + /* FALLTHROUGH */ + case 1: + MMIO(REG_6326_3D_TextureAddress1, prev->texture[0].texOffset1); + /* FALLTHROUGH */ + case 0: + MMIO(REG_6326_3D_TextureAddress0, prev->texture[0].texOffset0); + MMIO(REG_6326_3D_TexturePitch01, prev->texture[0].texPitch01); + break; + } + } + + /* texture environment */ + if (smesa->GlobalFlag & GFLAG_TEXTUREENV) { + MMIO(REG_6326_3D_TextureBlendSet, prev->hwTexBlendSet); + } + + smesa->GlobalFlag &= ~GFLAG_TEXTURE_STATES; +} diff --git a/src/mesa/drivers/dri/sis/sis_context.h b/src/mesa/drivers/dri/sis/sis_context.h index 9aa92ff6e4b..ead4a26678e 100644 --- a/src/mesa/drivers/dri/sis/sis_context.h +++ b/src/mesa/drivers/dri/sis/sis_context.h @@ -44,6 +44,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "sis_screen.h" #include "sis_reg.h" +#include "sis6326_reg.h" #include "sis_dri.h" /* for GLboolean */ @@ -65,7 +66,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #define SIS_FALLBACK_TEXENV1 0x0010 #define SIS_FALLBACK_DRAW_BUFFER 0x0020 #define SIS_FALLBACK_STENCIL 0x0040 -#define SIS_FALLBACK_DISABLE 0x0080 +#define SIS_FALLBACK_WRITEMASK 0x0080 +#define SIS_FALLBACK_DISABLE 0x0100 /* Flags for hardware state that needs to be updated */ #define GFLAG_ENABLESETTING 0x00000001 @@ -132,7 +134,8 @@ typedef struct sis_tex_obj { sisTexImage image[SIS_MAX_TEXTURE_LEVELS]; /* Image data for each mipmap * level */ GLenum format; /* One of GL_ALPHA, GL_INTENSITY, GL_LUMINANCE, - * GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA */ + * GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA + * MESA_YCBCR */ GLint hwformat; /* One of the TEXEL_ defines */ GLint numImages; /* Number of images loaded into .image */ } sisTexObj, *sisTexObjPtr; @@ -146,6 +149,7 @@ typedef struct __GLSiSTextureRec GLint hwTextureMip; GLint hwTextureClrHigh; GLint hwTextureClrLow; + GLint hwTexWidthHeight; /* 6326: Texture Blending Setting */ GLint hwTextureBorderColor; GLint texOffset0; @@ -205,6 +209,7 @@ typedef struct __GLSiSHardwareRec GLint hwTexEnvColor; /* Texture Blending Setting */ + GLint hwTexBlendSet; /* 6326 */ GLint hwTexBlendColor0; GLint hwTexBlendColor1; GLint hwTexBlendAlpha0; @@ -322,6 +327,7 @@ struct sis_context __GLSiSHardware prev, current; int Chipset; + GLboolean is6326; GLint drawableID; @@ -395,6 +401,12 @@ struct sis_context #define MMIO_READ(reg) *(volatile GLint *)(smesa->IOBase + (reg)) #define MMIO_READf(reg) *(volatile GLfloat *)(smesa->IOBase + (reg)) +#if defined(__i386__) || defined(__amd64__) +#define MMIO_WMB() __asm __volatile("" : : : "memory") +#else +#error platform needs WMB +#endif + #define mEndPrimitive() \ { \ *(volatile GLubyte *)(smesa->IOBase + REG_3D_EndPrimitiveList) = 0xff; \ @@ -446,6 +458,8 @@ void WaitingFor3dIdle(sisContextPtr smesa, int wLen); /* update to hw */ extern void sis_update_texture_state( sisContextPtr smesa ); extern void sis_update_render_state( sisContextPtr smesa ); +extern void sis6326_update_texture_state( sisContextPtr smesa ); +extern void sis6326_update_render_state( sisContextPtr smesa ); /* ================================================================ * Debugging: diff --git a/src/mesa/drivers/dri/sis/sis_lock.c b/src/mesa/drivers/dri/sis/sis_lock.c index 386f99ca27d..70ca8e6cbc6 100644 --- a/src/mesa/drivers/dri/sis/sis_lock.c +++ b/src/mesa/drivers/dri/sis/sis_lock.c @@ -66,7 +66,10 @@ sisGetLock( sisContextPtr smesa, GLuint flags ) if ( smesa->lastStamp != dPriv->lastStamp ) { sisUpdateBufferSize( smesa ); sisUpdateClipping( smesa->glCtx ); - sisDDDrawBuffer( smesa->glCtx, smesa->glCtx->Color.DrawBuffer[0] ); + if (smesa->is6326) + sis6326DDDrawBuffer( smesa->glCtx, smesa->glCtx->Color.DrawBuffer[0] ); + else + sisDDDrawBuffer( smesa->glCtx, smesa->glCtx->Color.DrawBuffer[0] ); driUpdateFramebufferSize(smesa->glCtx, dPriv); smesa->lastStamp = dPriv->lastStamp; } diff --git a/src/mesa/drivers/dri/sis/sis_state.c b/src/mesa/drivers/dri/sis/sis_state.c index 195a624b40c..f41fb3da04f 100644 --- a/src/mesa/drivers/dri/sis/sis_state.c +++ b/src/mesa/drivers/dri/sis/sis_state.c @@ -290,6 +290,12 @@ sisUpdateClipping( GLcontext *ctx ) GLint x1, y1, x2, y2; + if (smesa->is6326) { + /* XXX: 6326 has its own clipping for now. Should be fixed */ + sis6326UpdateClipping(ctx); + return; + } + x1 = 0; y1 = 0; x2 = smesa->width - 1; @@ -824,7 +830,7 @@ void sisDDInitState( sisContextPtr smesa ) */ void sisDDInitStateFuncs( GLcontext *ctx ) { - ctx->Driver.UpdateState = sisDDInvalidateState; + ctx->Driver.UpdateState = sisDDInvalidateState; ctx->Driver.Clear = sisDDClear; ctx->Driver.ClearColor = sisDDClearColor; diff --git a/src/mesa/drivers/dri/sis/sis_state.h b/src/mesa/drivers/dri/sis/sis_state.h index 770ba478a48..580a522bf34 100644 --- a/src/mesa/drivers/dri/sis/sis_state.h +++ b/src/mesa/drivers/dri/sis/sis_state.h @@ -34,20 +34,37 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "sis_context.h" -extern void sisDDInitState( sisContextPtr smesa ); -extern void sisDDInitStateFuncs( GLcontext *ctx ); +/* sis6326_clear.c */ +extern void sis6326DDClear( GLcontext *ctx, GLbitfield mask, GLboolean all, + GLint x, GLint y, GLint width, GLint height ); +extern void sis6326DDClearColor( GLcontext * ctx, const GLfloat color[4] ); +extern void sis6326DDClearDepth( GLcontext * ctx, GLclampd d ); +extern void sis6326UpdateZPattern(sisContextPtr smesa, GLclampd z); +/* sis_clear.c */ extern void sisDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all, GLint x, GLint y, GLint width, GLint height ); extern void sisDDClearColor( GLcontext * ctx, const GLfloat color[4] ); extern void sisDDClearDepth( GLcontext * ctx, GLclampd d ); extern void sisDDClearStencil( GLcontext * ctx, GLint s ); +extern void sisUpdateZStencilPattern( sisContextPtr smesa, GLclampd z, + int stencil ); + +/* sis_fog.c */ extern void sisDDFogfv( GLcontext * ctx, GLenum pname, const GLfloat * params ); -extern void sisDDDepthMask( GLcontext * ctx, GLboolean flag ); +/* sis6326_state.c */ +extern void sis6326DDInitState( sisContextPtr smesa ); +extern void sis6326DDInitStateFuncs( GLcontext *ctx ); +extern void sis6326UpdateClipping( GLcontext * gc ); +extern void sis6326DDDrawBuffer( GLcontext *ctx, GLenum mode ); +extern void sis6326UpdateHWState( GLcontext *ctx ); + +/* sis_state.c */ +extern void sisDDInitState( sisContextPtr smesa ); +extern void sisDDInitStateFuncs( GLcontext *ctx ); +extern void sisDDDepthMask( GLcontext * ctx, GLboolean flag ); extern void sisUpdateClipping( GLcontext * gc ); -extern void sisUpdateZStencilPattern( sisContextPtr smesa, GLclampd z, - int stencil ); extern void sisDDDrawBuffer( GLcontext *ctx, GLenum mode ); extern void sisUpdateHWState( GLcontext *ctx ); diff --git a/src/mesa/drivers/dri/sis/sis_tris.c b/src/mesa/drivers/dri/sis/sis_tris.c index da1e1ee6922..44cbcd66706 100644 --- a/src/mesa/drivers/dri/sis/sis_tris.c +++ b/src/mesa/drivers/dri/sis/sis_tris.c @@ -50,6 +50,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "sis_alloc.h" #include "sis_tex.h" +/* 6326 and 300-series shared */ static const GLuint hw_prim[GL_POLYGON+1] = { OP_3D_POINT_DRAW, /* GL_POINTS */ OP_3D_LINE_DRAW, /* GL_LINES */ @@ -68,6 +69,11 @@ static const GLuint hw_prim_mmio_fire[OP_3D_TRIANGLE_DRAW+1] = { OP_3D_FIRE_TSARGBb, OP_3D_FIRE_TSARGBc }; +static const GLuint hw_prim_6326_mmio_fire[OP_3D_TRIANGLE_DRAW+1] = { + OP_6326_3D_FIRE_TSARGBa, + OP_6326_3D_FIRE_TSARGBb, + OP_6326_3D_FIRE_TSARGBc +}; static const GLuint hw_prim_mmio_shade[OP_3D_TRIANGLE_DRAW+1] = { SHADE_FLAT_VertexA, @@ -142,6 +148,25 @@ do { \ MMIO(REG_3D_TSARGBa+(i)*0x30, __color); \ } while (0) +#define SIS6326_MMIO_WRITE_VERTEX(_v, i, lastvert) \ +do { \ + GLuint __color, __i = 0; \ + MMIO(REG_6326_3D_TSXa+(i)*0x20, _v->ui[__i++]); \ + MMIO(REG_6326_3D_TSYa+(i)*0x20, _v->ui[__i++]); \ + MMIO(REG_6326_3D_TSZa+(i)*0x20, _v->ui[__i++]); \ + if (SIS_STATES & VERT_W) \ + MMIO(REG_6326_3D_TSWa+(i)*0x20, _v->ui[__i++]); \ + __color = _v->ui[__i++]; \ + if (SIS_STATES & VERT_SPEC) \ + MMIO(REG_6326_3D_TSFSa+(i)*0x20, _v->ui[__i++]); \ + if (SIS_STATES & VERT_UV0) { \ + MMIO(REG_6326_3D_TSUa+(i)*0x20, _v->ui[__i++]); \ + MMIO(REG_6326_3D_TSVa+(i)*0x20, _v->ui[__i++]); \ + } \ + if (lastvert || (SIS_STATES & VERT_SMOOTH)) \ + MMIO(REG_6326_3D_TSARGBa+(i)*0x30, __color); \ +} while (0) + #define MMIO_VERT_REG_COUNT 10 #define VERT_SMOOTH 0x01 @@ -149,11 +174,12 @@ do { \ #define VERT_SPEC 0x04 #define VERT_UV0 0x08 #define VERT_UV1 0x10 +#define VERT_6326 0x20 /* Right after UV1, but won't have a UV1 set */ typedef void (*mmio_draw_func)(sisContextPtr smesa, char *verts); -static mmio_draw_func sis_tri_func_mmio[32]; -static mmio_draw_func sis_line_func_mmio[32]; -static mmio_draw_func sis_point_func_mmio[32]; +static mmio_draw_func sis_tri_func_mmio[48]; +static mmio_draw_func sis_line_func_mmio[48]; +static mmio_draw_func sis_point_func_mmio[48]; #define SIS_STATES (0) #define TAG(x) x##_none @@ -754,17 +780,30 @@ static void sisRasterPrimitive( GLcontext *ctx, GLuint hwprim ) if (smesa->hw_primitive != hwprim) { SIS_FIREVERTICES(smesa); smesa->hw_primitive = hwprim; + smesa->AGPParseSet &= ~(MASK_PsDataType | MASK_PsShadingMode); - smesa->dwPrimitiveSet &= ~(MASK_DrawPrimitiveCommand | - MASK_SetFirePosition | MASK_ShadingMode); smesa->AGPParseSet |= hw_prim_agp_type[hwprim]; - smesa->dwPrimitiveSet |= hwprim | hw_prim_mmio_fire[hwprim]; + + if (smesa->is6326) { + smesa->dwPrimitiveSet &= ~(MASK_6326_DrawPrimitiveCommand | + MASK_6326_SetFirePosition | MASK_6326_ShadingMode); + smesa->dwPrimitiveSet |= hwprim | hw_prim_6326_mmio_fire[hwprim]; + } else { + smesa->dwPrimitiveSet &= ~(MASK_DrawPrimitiveCommand | + MASK_SetFirePosition | MASK_ShadingMode); + smesa->dwPrimitiveSet |= hwprim | hw_prim_mmio_fire[hwprim]; + } + if (ctx->Light.ShadeModel == GL_FLAT) { smesa->AGPParseSet |= hw_prim_agp_shade[hwprim]; smesa->dwPrimitiveSet |= hw_prim_mmio_shade[hwprim]; } else { smesa->AGPParseSet |= MASK_PsShadingSmooth; - smesa->dwPrimitiveSet |= SHADE_GOURAUD; + if (smesa->is6326) { + smesa->dwPrimitiveSet |= OP_6326_3D_SHADE_FLAT_GOURAUD; + } else { + smesa->dwPrimitiveSet |= SHADE_GOURAUD; + } } } } @@ -867,6 +906,7 @@ static void sisRenderStart( GLcontext *ctx ) EMIT_ATTR(_TNL_ATTRIB_TEX0, EMIT_2F); AGPParseSet |= SiS_PS_HAS_UV0; } + /* Will only hit tex1 on SiS300 */ if (index & _TNL_BIT_TEX(1)) { if (VB->TexCoordPtr[1]->size > 2) tex_fallback = GL_TRUE; @@ -900,7 +940,10 @@ sisFlushPrimsLocked(sisContextPtr smesa) if (smesa->vb_cur == smesa->vb_last) return; - sisUpdateHWState(smesa->glCtx); + if (smesa->is6326) + sis6326UpdateHWState(smesa->glCtx); + else + sisUpdateHWState(smesa->glCtx); if (smesa->using_agp) { mWait3DCmdQueue(8); @@ -926,6 +969,8 @@ sisFlushPrimsLocked(sisContextPtr smesa) mmio_index |= VERT_UV0; if (smesa->AGPParseSet & SiS_PS_HAS_UV1) mmio_index |= VERT_UV1; + if (smesa->is6326) + mmio_index |= VERT_6326; switch (smesa->AGPParseSet & MASK_PsDataType) { case MASK_PsPointList: @@ -941,9 +986,11 @@ sisFlushPrimsLocked(sisContextPtr smesa) sis_emit_func = sis_tri_func_mmio[mmio_index]; break; } - - mWait3DCmdQueue(1); - MMIO(REG_3D_PrimitiveSet, smesa->dwPrimitiveSet); + + if (!smesa->is6326) { + mWait3DCmdQueue(1); + MMIO(REG_3D_PrimitiveSet, smesa->dwPrimitiveSet); + } while (smesa->vb_last < smesa->vb_cur) { sis_emit_func(smesa, smesa->vb_last); smesa->vb_last += incr; @@ -976,6 +1023,7 @@ static const char * const fallbackStrings[] = { "Texture 1 env", /* Note: unused */ "glDrawBuffer(GL_FRONT_AND_BACK)", "glEnable(GL_STENCIL) without hw stencil buffer", + "write mask", "no_rast", }; diff --git a/src/mesa/drivers/dri/sis/sis_tritmp.h b/src/mesa/drivers/dri/sis/sis_tritmp.h index bd2ecd1c4cd..e670a5bf760 100644 --- a/src/mesa/drivers/dri/sis/sis_tritmp.h +++ b/src/mesa/drivers/dri/sis/sis_tritmp.h @@ -1,32 +1,32 @@ /* $XFree86*/ /* -*- c-basic-offset: 3 -*- */ -/************************************************************************** - -Copyright 2003 Eric Anholt -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 -ERIC ANHOLT 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. - -**************************************************************************/ - /* + * Copyright 2005 Eric Anholt + * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS 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: - * Eric Anholt <[email protected]> + * Eric Anholt <[email protected]> + * Jim Duchek <[email protected]> -- Utah GLX 6326 code + * Alan Cox <[email protected]> -- 6326 Debugging + * */ static void TAG(sis_draw_tri_mmio)(sisContextPtr smesa, char *verts) @@ -59,11 +59,191 @@ static void TAG(sis_draw_point_mmio)(sisContextPtr smesa, char *verts) SIS_MMIO_WRITE_VERTEX(v0, 1, 1); } +#if !(SIS_STATES & VERT_UV1) +static void TAG(sis6326_draw_tri_mmio)(sisContextPtr smesa, char *verts) +{ + sisVertexPtr v0 = (sisVertexPtr)verts; + sisVertexPtr v1 = (sisVertexPtr)(verts + smesa->vertex_size * 4); + sisVertexPtr v2 = (sisVertexPtr)(verts + smesa->vertex_size * 4 * 2); + GLfloat x0, x1, x2; + GLfloat y0, y1, y2; + GLfloat delt02, diffx02, diffy02, diffy12; + GLint dwPrimitiveSet = smesa->dwPrimitiveSet; + sisVertex tv0, tv1, tv2; + + /* XXX Culling? */ + + tv0 = *v0; + tv1 = *v1; + tv2 = *v2; + tv0.v.y = Y_FLIP(tv0.v.y); + tv1.v.y = Y_FLIP(tv1.v.y); + tv2.v.y = Y_FLIP(tv2.v.y); + v0 = &tv0; + v1 = &tv1; + v2 = &tv2; + + /* Cull polygons we won't draw. The hardware draws funky things if it + is fed these */ + if((((v1->v.x - v0->v.x) * (v0->v.y - v2->v.y)) + + ((v1->v.y - v0->v.y) * (v2->v.x - v0->v.x))) < 0) + return; + y0 = v0->v.y; + y1 = v1->v.y; + y2 = v2->v.y; + + + if (y0 > y1) { + if (y1 > y2) { + x0 = v0->v.x; + x1 = v1->v.x; + x2 = v2->v.x; + dwPrimitiveSet |= OP_6326_3D_ATOP | OP_6326_3D_BMID | OP_6326_3D_CBOT; + if ((SIS_STATES & VERT_SMOOTH) == 0) + dwPrimitiveSet |= OP_6326_3D_SHADE_FLAT_BOT; + } else { + if (y0 > y2) { + x0 = v0->v.x; + x1 = v2->v.x; + y1 = v2->v.y; + dwPrimitiveSet |= OP_6326_3D_ATOP | OP_6326_3D_CMID | + OP_6326_3D_BBOT; + if ((SIS_STATES & VERT_SMOOTH) == 0) + dwPrimitiveSet |= OP_6326_3D_SHADE_FLAT_MID; + } else { + x0 = v2->v.x; + y0 = v2->v.y; + x1 = v0->v.x; + y1 = v0->v.y; + dwPrimitiveSet |= OP_6326_3D_CTOP | OP_6326_3D_AMID | + OP_6326_3D_BBOT; + if ((SIS_STATES & VERT_SMOOTH) == 0) + dwPrimitiveSet |= OP_6326_3D_SHADE_FLAT_TOP; + } + x2 = v1->v.x; + y2 = v1->v.y; + } + } else { + if (y0 > y2) { + x0 = v1->v.x; + y0 = v1->v.y; + x1 = v0->v.x; + y1 = v0->v.y; + x2 = v2->v.x; + dwPrimitiveSet |= OP_6326_3D_BTOP | OP_6326_3D_AMID | OP_6326_3D_CBOT; + if ((SIS_STATES & VERT_SMOOTH) == 0) + dwPrimitiveSet |= OP_6326_3D_SHADE_FLAT_BOT; + } else { + if (y1 > y2) { + x0 = v1->v.x; + y0 = v1->v.y; + x1 = v2->v.x; + y1 = v2->v.y; + dwPrimitiveSet |= OP_6326_3D_BTOP | OP_6326_3D_CMID | + OP_6326_3D_ABOT; + if ((SIS_STATES & VERT_SMOOTH) == 0) + dwPrimitiveSet |= OP_6326_3D_SHADE_FLAT_MID; + } else { + x0 = v2->v.x; + y0 = v2->v.y; + x1 = v1->v.x; + dwPrimitiveSet |= OP_6326_3D_CTOP | OP_6326_3D_BMID | + OP_6326_3D_ABOT; + if ((SIS_STATES & VERT_SMOOTH) == 0) + dwPrimitiveSet |= OP_6326_3D_SHADE_FLAT_TOP; + } + x2 = v0->v.x; + y2 = v0->v.y; + } + } + + if (x1 <= x0 && x1 <= x2) { + dwPrimitiveSet |= OP_3D_DIRECTION_LEFT; + } else if (x1 < x0 || x1 < x2) { + GLfloat tmp; + + diffx02 = x0 - x2; + diffy02 = y0 - y2; + diffy12 = y1 - y2; + + delt02 = diffx02 / diffy02; + tmp = x1 - (diffy12 * delt02 + x2); + + if (tmp <= 0.0) + dwPrimitiveSet |= OP_3D_DIRECTION_LEFT; + } + + tv0 = *v0; + tv1 = *v1; + tv2 = *v2; + tv0.v.y = Y_FLIP(tv0.v.y); + tv1.v.y = Y_FLIP(tv1.v.y); + tv2.v.y = Y_FLIP(tv2.v.y); + v0 = &tv0; + v1 = &tv1; + v2 = &tv2; + + y0 = v0->v.y; + y1 = v1->v.y; + y2 = v2->v.y; + +/* fprintf(stderr, "Vertex0 %f %f %f\n", v0->v.x, v0->v.y, v0->v.z); + fprintf(stderr, "Vertex1 %f %f %f\n", v1->v.x, v1->v.y, v1->v.z); + fprintf(stderr, "Vertex2 %f %f %f\n", v2->v.x, v2->v.y, v2->v.z);*/ + mWait3DCmdQueue(MMIO_VERT_REG_COUNT * 3 + 1); + MMIO(REG_3D_PrimitiveSet, dwPrimitiveSet); + SIS_MMIO_WRITE_VERTEX(v0, 0, 0); + SIS_MMIO_WRITE_VERTEX(v1, 1, 0); + SIS_MMIO_WRITE_VERTEX(v2, 2, 1); + mEndPrimitive(); +} + +static void TAG(sis6326_draw_line_mmio)(sisContextPtr smesa, char *verts) +{ + sisVertexPtr v0 = (sisVertexPtr)verts; + sisVertexPtr v1 = (sisVertexPtr)(verts + smesa->vertex_size * 4); + GLint dwPrimitiveSet = smesa->dwPrimitiveSet; + + if (abs(v0->v.y - v1->v.y) > abs(v0->v.x - v1->v.x)) + { + dwPrimitiveSet |= OP_3D_DIRECTION_VERTICAL; + if (v0->v.y > v1->v.y) + dwPrimitiveSet |= OP_6326_3D_ATOP | OP_6326_3D_BBOT; + else + dwPrimitiveSet |= OP_6326_3D_BTOP | OP_6326_3D_ABOT; + } else { + if (v0->v.y > v1->v.y) + dwPrimitiveSet |= OP_6326_3D_BTOP | OP_6326_3D_ABOT; + else + dwPrimitiveSet |= OP_6326_3D_ATOP | OP_6326_3D_BBOT; + } + + mWait3DCmdQueue (MMIO_VERT_REG_COUNT * 2 + 1); + MMIO(REG_3D_PrimitiveSet, dwPrimitiveSet); + SIS_MMIO_WRITE_VERTEX(v0, 0, 0); + SIS_MMIO_WRITE_VERTEX(v1, 1, 1); +} + +static void TAG(sis6326_draw_point_mmio)(sisContextPtr smesa, char *verts) +{ + sisVertexPtr v0 = (sisVertexPtr)verts; + + mWait3DCmdQueue (MMIO_VERT_REG_COUNT * 1 + 1); + MMIO(REG_3D_PrimitiveSet, smesa->dwPrimitiveSet | OP_6326_3D_ATOP); + SIS_MMIO_WRITE_VERTEX(v0, 1, 1); +} +#endif + static __inline void TAG(sis_vert_init)( void ) { sis_tri_func_mmio[SIS_STATES] = TAG(sis_draw_tri_mmio); sis_line_func_mmio[SIS_STATES] = TAG(sis_draw_line_mmio); sis_point_func_mmio[SIS_STATES] = TAG(sis_draw_point_mmio); +#if !(SIS_STATES & VERT_UV1) + sis_tri_func_mmio[SIS_STATES | VERT_6326] = TAG(sis6326_draw_tri_mmio); + sis_line_func_mmio[SIS_STATES | VERT_6326] = TAG(sis6326_draw_line_mmio); + sis_point_func_mmio[SIS_STATES | VERT_6326] = TAG(sis6326_draw_point_mmio); +#endif } #undef TAG |