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, PRECISION INSIGHT AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ERIC ANHOLT OR SILICON INTEGRATED SYSTEMS CORP 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.
#include "sis_tex.h"
#include "context.h"
+#include "buffers.h"
#include "enums.h"
#include "colormac.h"
#include "swrast/swrast.h"
}
static void
-sisDDBlendFunc( GLcontext *ctx, GLenum sfactor, GLenum dfactor )
+sisDDBlendFuncSeparate( GLcontext *ctx,
+ GLenum sfactorRGB, GLenum dfactorRGB,
+ GLenum sfactorA, GLenum dfactorA )
{
sisContextPtr smesa = SIS_CONTEXT(ctx);
__GLSiSHardware *prev = &smesa->prev;
__GLSiSHardware *current = &smesa->current;
- /* TODO: in ICD, if no blend, it will reset these value */
- /* blending enable */
- current->hwDstSrcBlend = 0x10000; /* Default destination alpha */
+ current->hwDstSrcBlend = 0;
- switch (dfactor)
+ switch (dfactorRGB)
{
case GL_ZERO:
current->hwDstSrcBlend |= SiS_D_ZERO;
case GL_ONE_MINUS_SRC_ALPHA:
current->hwDstSrcBlend |= SiS_D_ONE_MINUS_SRC_ALPHA;
break;
+ case GL_DST_COLOR:
+ current->hwDstSrcBlend |= SiS_D_DST_COLOR;
+ break;
+ case GL_ONE_MINUS_DST_COLOR:
+ current->hwDstSrcBlend |= SiS_D_ONE_MINUS_DST_COLOR;
+ break;
case GL_DST_ALPHA:
current->hwDstSrcBlend |= SiS_D_DST_ALPHA;
break;
case GL_ONE_MINUS_DST_ALPHA:
current->hwDstSrcBlend |= SiS_D_ONE_MINUS_DST_ALPHA;
break;
+ default:
+ fprintf(stderr, "Unknown dst blend function 0x%x\n", dfactorRGB);
+ break;
}
- switch (sfactor)
+ switch (sfactorRGB)
{
case GL_ZERO:
current->hwDstSrcBlend |= SiS_S_ZERO;
case GL_ONE:
current->hwDstSrcBlend |= SiS_S_ONE;
break;
+ case GL_SRC_COLOR:
+ current->hwDstSrcBlend |= SiS_S_SRC_COLOR;
+ break;
+ case GL_ONE_MINUS_SRC_COLOR:
+ current->hwDstSrcBlend |= SiS_S_ONE_MINUS_SRC_COLOR;
+ break;
case GL_SRC_ALPHA:
current->hwDstSrcBlend |= SiS_S_SRC_ALPHA;
break;
case GL_ONE_MINUS_SRC_ALPHA:
current->hwDstSrcBlend |= SiS_S_ONE_MINUS_SRC_ALPHA;
break;
- case GL_DST_ALPHA:
- current->hwDstSrcBlend |= SiS_S_DST_ALPHA;
- break;
- case GL_ONE_MINUS_DST_ALPHA:
- current->hwDstSrcBlend |= SiS_S_ONE_MINUS_DST_ALPHA;
- break;
case GL_DST_COLOR:
current->hwDstSrcBlend |= SiS_S_DST_COLOR;
break;
case GL_ONE_MINUS_DST_COLOR:
current->hwDstSrcBlend |= SiS_S_ONE_MINUS_DST_COLOR;
break;
+ case GL_DST_ALPHA:
+ current->hwDstSrcBlend |= SiS_S_DST_ALPHA;
+ break;
+ case GL_ONE_MINUS_DST_ALPHA:
+ current->hwDstSrcBlend |= SiS_S_ONE_MINUS_DST_ALPHA;
+ break;
case GL_SRC_ALPHA_SATURATE:
current->hwDstSrcBlend |= SiS_S_SRC_ALPHA_SATURATE;
break;
+ default:
+ fprintf(stderr, "Unknown src blend function 0x%x\n", sfactorRGB);
+ break;
}
if (current->hwDstSrcBlend != prev->hwDstSrcBlend) {
current->hwCapEnable2 |= (MASK_AlphaMaskWriteEnable |
MASK_ColorMaskWriteEnable);
- current->hwDstMask = (r) ? GET_RMASK(smesa) : 0 |
- (g) ? GET_GMASK(smesa) : 0 |
- (b) ? GET_BMASK(smesa) : 0 |
- (a) ? GET_AMASK(smesa) : 0;
+ current->hwDstMask = (r) ? smesa->redMask : 0 |
+ (g) ? smesa->greenMask : 0 |
+ (b) ? smesa->blueMask : 0 |
+ (a) ? smesa->alphaMask : 0;
}
if (current->hwDstMask != prev->hwDstMask) {
GLint x, GLint y,
GLsizei width, GLsizei height )
{
+ /* update size of Mesa/software ancillary buffers */
+ _mesa_ResizeBuffersMESA();
sisCalcViewport( ctx );
}
__GLSiSHardware *prev = &smesa->prev;
__GLSiSHardware *current = &smesa->current;
- if (!ctx->Color.ColorLogicOpEnabled)
- return;
-
current->hwDstSet &= ~MASK_ROP2;
switch (opcode)
{
/*
* _DrawDestMask is easier to cope with than <mode>.
*/
- switch ( ctx->Color._DrawDestMask ) {
- case FRONT_LEFT_BIT:
- case BACK_LEFT_BIT:
+ switch ( ctx->Color._DrawDestMask[0] ) {
+ case DD_FRONT_LEFT_BIT:
+ case DD_BACK_LEFT_BIT:
FALLBACK( smesa, SIS_FALLBACK_DRAW_BUFFER, GL_FALSE );
break;
default:
}
}
-static void
-sisDDHint( GLcontext *ctx, GLenum target, GLenum mode )
-{
-
- switch (target) {
- case GL_FOG_HINT:
- /* Update fog mode setting */
- sisDDFogfv(ctx, GL_FOG_MODE, NULL);
- break;
- }
-
-}
-
/* =============================================================
* Polygon stipple
*/
}
}
-/* =============================================================
- * Pixel functions
- */
-
-static void
-sisDDDrawPixels( GLcontext *ctx,
- GLint x, GLint y, GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *unpack,
- const GLvoid *pixels )
-{
- sisContextPtr smesa = SIS_CONTEXT(ctx);
-
- LOCK_HARDWARE();
- _swrast_DrawPixels( ctx, x, y, width, height, format, type, unpack, pixels );
- UNLOCK_HARDWARE();
-}
-
-static void
-sisDDReadPixels( GLcontext *ctx,
- GLint x, GLint y, GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *pack,
- GLvoid *pixels )
-{
- sisContextPtr smesa = SIS_CONTEXT(ctx);
-
- LOCK_HARDWARE();
- _swrast_ReadPixels( ctx, x, y, width, height, format, type, pack,
- pixels);
- UNLOCK_HARDWARE();
-}
-
-static void
-sisDDBitmap( GLcontext *ctx, GLint px, GLint py,
- GLsizei width, GLsizei height,
- const struct gl_pixelstore_attrib *unpack,
- const GLubyte *bitmap )
-{
- sisContextPtr smesa = SIS_CONTEXT(ctx);
-
- LOCK_HARDWARE();
- _swrast_Bitmap( ctx, px, py, width, height, unpack, bitmap );
- UNLOCK_HARDWARE();
-}
/* =============================================================
* State initialization, management
__GLSiSHardware *prev = &smesa->prev;
__GLSiSHardware *current = &smesa->current;
- if (smesa->NewGLState & _NEW_TEXTURE)
- sisUpdateTextureState( ctx );
-
/* enable setting 1 */
if (current->hwCapEnable ^ prev->hwCapEnable) {
prev->hwCapEnable = current->hwCapEnable;
smesa->GlobalFlag |= GFLAG_ENABLESETTING2;
}
- /* TODO: if fog disable, don't check */
- if (current->hwCapEnable & MASK_FogEnable) {
- /* fog setting */
- if (current->hwFog != prev->hwFog) {
- prev->hwFog = current->hwFog;
- smesa->GlobalFlag |= GFLAG_FOGSETTING;
- }
- if (current->hwFogFar != prev->hwFogFar) {
- prev->hwFogFar = current->hwFogFar;
- smesa->GlobalFlag |= GFLAG_FOGSETTING;
- }
- if (current->hwFogInverse != prev->hwFogInverse) {
- prev->hwFogInverse = current->hwFogInverse;
- smesa->GlobalFlag |= GFLAG_FOGSETTING;
- }
- if (current->hwFogDensity != prev->hwFogDensity) {
- prev->hwFogDensity = current->hwFogDensity;
- smesa->GlobalFlag |= GFLAG_FOGSETTING;
- }
- }
-
if (smesa->GlobalFlag & GFLAG_RENDER_STATES)
sis_update_render_state( smesa );
prev->texture[0].hwTextureMip = 0;
#endif
- /* Texture Blending seeting */
- prev->hwTexBlendClr0 = L_REPLACE__RGB_STAGE0;
- prev->hwTexBlendClr1 = 0x294B4000;
- prev->hwTexBlendAlpha0 = 0x333A0000;
- prev->hwTexBlendAlpha1 = 0x333A0000;
+ /* Texture Blending setting -- use fragment color/alpha*/
+ prev->hwTexBlendColor0 = STAGE0_C_CF;
+ prev->hwTexBlendColor1 = STAGE1_C_CF;
+ prev->hwTexBlendAlpha0 = STAGE0_A_AF;
+ prev->hwTexBlendAlpha1 = STAGE1_A_AF;
switch (smesa->bytesPerPixel)
{
smesa->clearColorPattern = 0;
- smesa->AGPParseSet = MASK_PsTexture1FromB;
+ smesa->AGPParseSet = MASK_PsTexture1FromB | MASK_PsBumpTextureFromC;
smesa->dwPrimitiveSet = OP_3D_Texture1FromB | OP_3D_TextureBumpFromC;
sisUpdateZStencilPattern( smesa, 1.0, 0 );
ctx->Driver.ClearStencil = sisDDClearStencil;
ctx->Driver.AlphaFunc = sisDDAlphaFunc;
- ctx->Driver.Bitmap = sisDDBitmap;
- ctx->Driver.BlendFunc = sisDDBlendFunc;
+ ctx->Driver.BlendFuncSeparate = sisDDBlendFuncSeparate;
ctx->Driver.ColorMask = sisDDColorMask;
ctx->Driver.CullFace = sisDDCullFace;
ctx->Driver.DepthMask = sisDDDepthMask;
ctx->Driver.DepthFunc = sisDDDepthFunc;
ctx->Driver.DepthRange = sisDDDepthRange;
ctx->Driver.DrawBuffer = sisDDDrawBuffer;
- ctx->Driver.DrawPixels = sisDDDrawPixels;
ctx->Driver.Enable = sisDDEnable;
ctx->Driver.FrontFace = sisDDFrontFace;
ctx->Driver.Fogfv = sisDDFogfv;
- ctx->Driver.Hint = sisDDHint;
+ ctx->Driver.Hint = NULL;
ctx->Driver.Lightfv = NULL;
ctx->Driver.LogicOpcode = sisDDLogicOpCode;
ctx->Driver.PolygonMode = NULL;
ctx->Driver.PolygonStipple = NULL;
ctx->Driver.ReadBuffer = NULL;
- ctx->Driver.ReadPixels = sisDDReadPixels;
ctx->Driver.RenderMode = NULL;
ctx->Driver.Scissor = sisDDScissor;
ctx->Driver.ShadeModel = sisDDShadeModel;
ctx->Driver.Viewport = sisDDViewport;
- /* Pixel path fallbacks.
- */
- ctx->Driver.Accum = _swrast_Accum;
- ctx->Driver.CopyPixels = _swrast_CopyPixels;
+ /* 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:
*/