示例#1
0
static void gammaDDLightModelfv( GLcontext *ctx, GLenum pname,
				const GLfloat *params )
{
   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);

   switch (pname) {
   case GL_LIGHT_MODEL_AMBIENT:
	CHECK_DMA_BUFFER(gmesa, 3);
	/* We don't do alpha */
	WRITEF(gmesa->buf, SceneAmbientColorBlue, params[2]);
	WRITEF(gmesa->buf, SceneAmbientColorGreen, params[1]);
	WRITEF(gmesa->buf, SceneAmbientColorRed, params[0]);
	break;
    case GL_LIGHT_MODEL_LOCAL_VIEWER:
	if (params[0] != 0.0)
	    gmesa->LightingMode |= LightingModeLocalViewer;
	else
	    gmesa->LightingMode &= ~LightingModeLocalViewer;
	CHECK_DMA_BUFFER(gmesa, 1);
	WRITE(gmesa->buf, LightingMode, gmesa->LightingMode);
	break;
    case GL_LIGHT_MODEL_TWO_SIDE:
	if (params[0] == 1.0f) {
	    gmesa->LightingMode |= LightingModeTwoSides;
	    gmesa->MaterialMode |= MaterialModeTwoSides;
	} else {
	    gmesa->LightingMode &= ~LightingModeTwoSides;
	    gmesa->MaterialMode &= ~MaterialModeTwoSides;
	}
	CHECK_DMA_BUFFER(gmesa, 2);
	WRITE(gmesa->buf, LightingMode, gmesa->LightingMode);
	WRITE(gmesa->buf, MaterialMode, gmesa->MaterialMode);
	break;
    }
}
示例#2
0
static void gammaReadRGBASpan8888( const GLcontext *ctx,
                                   GLuint n, GLint x, GLint y,
                                   GLubyte rgba[][4])
{
    gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);
    gammaScreenPtr gammascrn = gmesa->gammaScreen;
    uint32_t dwords1, dwords2, i = 0;
    char *src = (char *)rgba[0];
    GLuint read = n * gammascrn->cpp; /* Number of bytes we are expecting */
    uint32_t data;

    FLUSH_DMA_BUFFER(gmesa);
    CHECK_DMA_BUFFER(gmesa, 16);
    WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode & ~(LBReadSrcEnable | LBReadDstEnable));
    WRITE(gmesa->buf, ColorDDAMode, ColorDDAEnable);
    WRITE(gmesa->buf, LBWriteMode, LBWriteModeDisable);
    WRITE(gmesa->buf, FBReadMode, (gmesa->FBReadMode & ~FBReadSrcEnable) | FBReadDstEnable | FBDataTypeColor);
    WRITE(gmesa->buf, FilterMode, 0x200); /* Pass FBColorData */
    WRITE(gmesa->buf, FBWriteMode, FBW_UploadColorData | FBWriteModeDisable);
    WRITE(gmesa->buf, StartXSub, (x+n)<<16);
    WRITE(gmesa->buf, StartXDom, x<<16);
    WRITE(gmesa->buf, StartY, y<<16);
    WRITE(gmesa->buf, GLINTCount, 1);
    WRITE(gmesa->buf, dXDom, 0<<16);
    WRITE(gmesa->buf, dXSub, 0<<16);
    WRITE(gmesa->buf, dY, 1<<16);
    WRITE(gmesa->buf, Render, PrimitiveTrapezoid);
    FLUSH_DMA_BUFFER(gmesa);

moredata:

    dwords1 = *(volatile uint32_t*)(void *)(((uint8_t*)gammascrn->regions[0].map) + (GlintOutFIFOWords));
    dwords2 = *(volatile uint32_t*)(void *)(((uint8_t*)gammascrn->regions[2].map) + (GlintOutFIFOWords));

    if (dwords1) {
        memcpy(src, (char*)gammascrn->regions[1].map + 0x1000, dwords1 << 2);
        src += dwords1 << 2;
        read -= dwords1 << 2;
    }
    if (dwords2) {
        memcpy(src, (char*)gammascrn->regions[3].map + 0x1000, dwords2 << 2);
        src += dwords2 << 2;
        read -= dwords2 << 2;
    }

    if (read)
        goto moredata;

done:

    CHECK_DMA_BUFFER(gmesa, 6);
    WRITE(gmesa->buf, ColorDDAMode, gmesa->ColorDDAMode);
    WRITE(gmesa->buf, LBWriteMode, LBWriteModeEnable);
    WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode);
    WRITE(gmesa->buf, FBReadMode, gmesa->FBReadMode);
    WRITE(gmesa->buf, FBWriteMode, FBWriteModeEnable);
    WRITE(gmesa->buf, FilterMode, 0x400);
}
示例#3
0
/* =============================================================
 * Points
 */
static void gammaDDPointSize( GLcontext *ctx, GLfloat size )
{
   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);

   CHECK_DMA_BUFFER(gmesa, 2);
   WRITE(gmesa->buf, PointSize, (GLuint)size);
   WRITEF(gmesa->buf, AApointSize, size);
}
示例#4
0
/* =============================================================
 * Lines
 */
static void gammaDDLineWidth( GLcontext *ctx, GLfloat width )
{
   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);

   CHECK_DMA_BUFFER(gmesa, 3);
   WRITE(gmesa->buf, LineWidth, (GLuint)width);
   WRITEF(gmesa->buf, AAlineWidth, width);
   WRITE(gmesa->buf, LineWidthOffset, (GLuint)(width-1)/2);
}
示例#5
0
static void gammaDDLightfv(GLcontext *ctx, GLenum light, GLenum pname, 
				const GLfloat *params, GLint nParams)
{
    gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);
    GLfloat l,x,y,z,w;

    switch(light) {
    case GL_LIGHT0:
	switch (pname) {
	case GL_AMBIENT:
	    CHECK_DMA_BUFFER(gmesa, 3);
	    /* We don't do alpha */
	    WRITEF(gmesa->buf, Light0AmbientIntensityBlue, params[2]);
	    WRITEF(gmesa->buf, Light0AmbientIntensityGreen, params[1]);
	    WRITEF(gmesa->buf, Light0AmbientIntensityRed, params[0]);
	    break;
	case GL_DIFFUSE:
	    CHECK_DMA_BUFFER(gmesa, 3);
	    /* We don't do alpha */
	    WRITEF(gmesa->buf, Light0DiffuseIntensityBlue, params[2]);
	    WRITEF(gmesa->buf, Light0DiffuseIntensityGreen, params[1]);
	    WRITEF(gmesa->buf, Light0DiffuseIntensityRed, params[0]);
	    break;
	case GL_SPECULAR:
	    CHECK_DMA_BUFFER(gmesa, 3);
	    /* We don't do alpha */
	    WRITEF(gmesa->buf, Light0SpecularIntensityBlue, params[2]);
	    WRITEF(gmesa->buf, Light0SpecularIntensityGreen, params[1]);
	    WRITEF(gmesa->buf, Light0SpecularIntensityRed, params[0]);
	    break;
	case GL_POSITION:
    	    /* Normalize <x,y,z> */
	    x = params[0]; y = params[1]; z = params[2]; w = params[3];
	    l = sqrt(x*x + y*y + z*z + w*w);
	    w /= l;
	    x /= l;
	    y /= l;
	    z /= l;
	    if (params[3] != 0.0) {
		gmesa->Light0Mode |= Light0ModeAttenuation;
		gmesa->Light0Mode |= Light0ModeLocal;
	    } else {
		gmesa->Light0Mode &= ~Light0ModeAttenuation;
		gmesa->Light0Mode &= ~Light0ModeLocal;
	    }
	    CHECK_DMA_BUFFER(gmesa, 5);
	    WRITE(gmesa->buf, Light0Mode, gmesa->Light0Mode);
	    WRITEF(gmesa->buf, Light0PositionW, w);
	    WRITEF(gmesa->buf, Light0PositionZ, z);
	    WRITEF(gmesa->buf, Light0PositionY, y);
	    WRITEF(gmesa->buf, Light0PositionX, x);
	    break;
	case GL_SPOT_DIRECTION:
	    CHECK_DMA_BUFFER(gmesa, 3);
	    /* WRITEF(gmesa->buf, Light0SpotlightDirectionW, params[3]); */
	    WRITEF(gmesa->buf, Light0SpotlightDirectionZ, params[2]);
	    WRITEF(gmesa->buf, Light0SpotlightDirectionY, params[1]);
	    WRITEF(gmesa->buf, Light0SpotlightDirectionX, params[0]);
	    break;
	case GL_SPOT_EXPONENT:
	    CHECK_DMA_BUFFER(gmesa, 1);
	    WRITEF(gmesa->buf, Light0SpotlightExponent, params[0]);
	    break;
	case GL_SPOT_CUTOFF:
	    if (params[0] != 180.0) 
		gmesa->Light0Mode |= Light0ModeSpotLight;
	    else
		gmesa->Light0Mode &= ~Light0ModeSpotLight;
	    CHECK_DMA_BUFFER(gmesa, 2);
	    WRITE(gmesa->buf, Light0Mode, gmesa->Light0Mode);
	    WRITEF(gmesa->buf, Light0CosSpotlightCutoffAngle, cos(params[0]*DEG2RAD));
	    break;
	case GL_CONSTANT_ATTENUATION:
	    CHECK_DMA_BUFFER(gmesa, 1);
	    WRITEF(gmesa->buf, Light0ConstantAttenuation, params[0]);
	    break;
	case GL_LINEAR_ATTENUATION:
	    CHECK_DMA_BUFFER(gmesa, 1);
	    WRITEF(gmesa->buf, Light0LinearAttenuation, params[0]);
	    break;
	case GL_QUADRATIC_ATTENUATION:
	    CHECK_DMA_BUFFER(gmesa, 1);
	    WRITEF(gmesa->buf, Light0QuadraticAttenuation, params[0]);
	    break;
	}
	break;
    }
}
示例#6
0
static void gammaDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
			       GLint cx, GLint cy, GLint cw, GLint ch )
{
   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);
   GLINTDRIPtr gDRIPriv = (GLINTDRIPtr)gmesa->driScreen->pDevPriv;
   GLuint temp = 0;

   FLUSH_BATCH( gmesa );

   /* Update and emit any new state.  We need to do this here to catch
    * changes to the masks.
    * FIXME: Just update the masks?
    */
   if ( gmesa->new_state )
      gammaDDUpdateHWState( ctx );

#ifdef DO_VALIDATE
    /* Flush any partially filled buffers */
    FLUSH_DMA_BUFFER(gmesa);

    DRM_SPINLOCK(&gmesa->driScreen->pSAREA->drawable_lock,
		 gmesa->driScreen->drawLockID);
    VALIDATE_DRAWABLE_INFO_NO_LOCK(gmesa);
#endif

    if (mask & BUFFER_BIT_DEPTH) {
	 /* Turn off writes the FB */
	 CHECK_DMA_BUFFER(gmesa, 1);
	 WRITE(gmesa->buf, FBWriteMode, FBWriteModeDisable);

	 mask &= ~BUFFER_BIT_DEPTH;

	 /*
	  * Turn Rectangle2DControl off when the window is not clipped
	  * (i.e., the GID tests are not necessary).  This dramatically
	  * increases the performance of the depth clears.
	  */
	 if (!gmesa->NotClipped) {
	    CHECK_DMA_BUFFER(gmesa, 1);
	    WRITE(gmesa->buf, Rectangle2DControl, 1);
	 }

	 temp = (gmesa->LBReadMode & LBPartialProdMask) | LBWindowOriginBot;
	 if (gDRIPriv->numMultiDevices == 2) temp |= LBScanLineInt2;
	 
	 CHECK_DMA_BUFFER(gmesa, 5);
	 WRITE(gmesa->buf, LBReadMode, temp);
	 WRITE(gmesa->buf, DeltaMode, DM_DepthEnable);
	 WRITE(gmesa->buf, DepthMode, (DepthModeEnable |
					DM_Always |
					DM_SourceDepthRegister |
					DM_WriteMask));
	 WRITE(gmesa->buf, GLINTDepth, gmesa->ClearDepth);

	 /* Increment the frame count */
	 gmesa->FrameCount++;
#ifdef FAST_CLEAR_4
	 gmesa->FrameCount &= 0x0f;
#else
	 gmesa->FrameCount &= 0xff;
#endif

	 /* Force FCP to be written */
	 WRITE(gmesa->buf, GLINTWindow, (WindowEnable |
					  W_PassIfEqual |
					  (gmesa->Window & W_GIDMask) |
					  W_DepthFCP |
					  W_LBUpdateFromRegisters |
					  W_OverrideWriteFiltering |
					  (gmesa->FrameCount << 9)));

	/* Clear part of the depth and FCP buffers */
	{
	    int y = gmesa->driScreen->fbHeight - gmesa->driDrawable->y - gmesa->driDrawable->h;
	    int x = gmesa->driDrawable->x;
	    int w = gmesa->driDrawable->w;
	    int h = gmesa->driDrawable->h;
#ifndef TURN_OFF_FCP
	    float hsub = h;

	    if (gmesa->WindowChanged) {
		gmesa->WindowChanged = GL_FALSE;
	    } else {
#ifdef FAST_CLEAR_4
		hsub /= 16;
#else
		hsub /= 256;
#endif

		/* Handle the case where the height < # of FCPs */
		if (hsub < 1.0) {
		    if (gmesa->FrameCount > h)
			gmesa->FrameCount = 0;
		    h = 1;
		    y += gmesa->FrameCount;
		} else {
		    h = (gmesa->FrameCount+1)*hsub;
		    h -= (int)(gmesa->FrameCount*hsub);
		    y += gmesa->FrameCount*hsub;
		}
	    }
#endif
	    if (h && w) {
#if 0
		CHECK_DMA_BUFFER(gmesa, 2);
		WRITE(gmesa->buf, Rectangle2DMode, ((h & 0xfff)<<12) |
						   (w & 0xfff) );
		WRITE(gmesa->buf, DrawRectangle2D, ((y & 0xffff)<<16) |
						   (x & 0xffff) );
#else
		CHECK_DMA_BUFFER(gmesa, 8);
		WRITE(gmesa->buf, StartXDom,   x<<16);
		WRITE(gmesa->buf, StartY,      y<<16);
		WRITE(gmesa->buf, StartXSub,   (x+w)<<16);
		WRITE(gmesa->buf, GLINTCount,  h);
		WRITE(gmesa->buf, dY,          1<<16);
		WRITE(gmesa->buf, dXDom,       0<<16);
		WRITE(gmesa->buf, dXSub,       0<<16);
		WRITE(gmesa->buf, Render,      0x00000040); /* NOT_DONE */
#endif
	    }
	}

	CHECK_DMA_BUFFER(gmesa, 6);
	WRITE(gmesa->buf, DepthMode, gmesa->DepthMode);
	WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode);
	WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode);
	WRITE(gmesa->buf, GLINTWindow, gmesa->Window);
	WRITE(gmesa->buf, FastClearDepth, gmesa->ClearDepth);
	WRITE(gmesa->buf, FBWriteMode, FBWriteModeEnable);

	/* Turn on Depth FCP */
	if (gmesa->Window & W_DepthFCP) {
	    CHECK_DMA_BUFFER(gmesa, 1);
	    WRITE(gmesa->buf, WindowOr, (gmesa->FrameCount << 9));
	}

	/* Turn off GID clipping if window is not clipped */
	if (gmesa->NotClipped) {
	    CHECK_DMA_BUFFER(gmesa, 1);
	    WRITE(gmesa->buf, Rectangle2DControl, 0);
	}
    }

    if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT)) {
	int y = gmesa->driScreen->fbHeight - gmesa->driDrawable->y - gmesa->driDrawable->h;
	int x = gmesa->driDrawable->x;
	int w = gmesa->driDrawable->w;
	int h = gmesa->driDrawable->h;

	mask &= ~(BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT);

	if (x < 0) { w -= -x; x = 0; }

	/* Turn on GID clipping if window is clipped */
	if (!gmesa->NotClipped) {
	    CHECK_DMA_BUFFER(gmesa, 1);
	    WRITE(gmesa->buf, Rectangle2DControl, 1);
	}

        CHECK_DMA_BUFFER(gmesa, 18);
        WRITE(gmesa->buf, FBBlockColor, gmesa->ClearColor);
        WRITE(gmesa->buf, ColorDDAMode, ColorDDADisable);
	WRITE(gmesa->buf, FBWriteMode, FBWriteModeEnable);
	WRITE(gmesa->buf, DepthMode, 0);
	WRITE(gmesa->buf, DeltaMode, 0);
	WRITE(gmesa->buf, AlphaBlendMode, 0);
#if 1
	WRITE(gmesa->buf, dY,          1<<16);
	WRITE(gmesa->buf, dXDom,       0<<16);
	WRITE(gmesa->buf, dXSub,       0<<16);
	WRITE(gmesa->buf, StartXSub,   (x+w)<<16);
	WRITE(gmesa->buf, GLINTCount,  h);
	WRITE(gmesa->buf, StartXDom,   x<<16);
	WRITE(gmesa->buf, StartY,      y<<16);
	WRITE(gmesa->buf, Render,      0x00000048); /* NOT_DONE */
#else
	WRITE(gmesa->buf, Rectangle2DMode, (((h & 0xfff)<<12) |
					      (w & 0xfff)));
	WRITE(gmesa->buf, DrawRectangle2D, (((y & 0xffff)<<16) |
					      (x & 0xffff)));
#endif
	WRITE(gmesa->buf, DepthMode, gmesa->DepthMode);
	WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode);
	WRITE(gmesa->buf, AlphaBlendMode, gmesa->AlphaBlendMode);
	WRITE(gmesa->buf, ColorDDAMode, gmesa->ColorDDAMode);

	/* Turn off GID clipping if window is clipped */
	if (gmesa->NotClipped) {
	    CHECK_DMA_BUFFER(gmesa, 1);
	    WRITE(gmesa->buf, Rectangle2DControl, 0);
	}
    }

#ifdef DO_VALIDATE
    PROCESS_DMA_BUFFER_TOP_HALF(gmesa);

    DRM_SPINUNLOCK(&gmesa->driScreen->pSAREA->drawable_lock,
		   gmesa->driScreen->drawLockID);
    VALIDATE_DRAWABLE_INFO_NO_LOCK_POST(gmesa);

    PROCESS_DMA_BUFFER_BOTTOM_HALF(gmesa);
#endif

   if ( mask )
      _swrast_Clear( ctx, mask, all, cx, cy, cw, ch );
}
示例#7
0
/*
 * Load the current context's state into the hardware.
 *
 * NOTE: Be VERY careful about ensuring the context state is marked for
 * upload, the only place it shouldn't be uploaded is when the setup
 * state has changed in ReducedPrimitiveChange as this comes right after
 * a state update.
 *
 * Blits of any type should always upload the context and masks after
 * they are done.
 */
void gammaEmitHwState( gammaContextPtr gmesa )
{
    if (!gmesa->driDrawable) return;

    if (!gmesa->dirty) return;

#ifdef DO_VALIDATE
    /* Flush any partially filled buffers */
    FLUSH_DMA_BUFFER(gmesa);

    DRM_SPINLOCK(&gmesa->driScreen->pSAREA->drawable_lock,
		 gmesa->driScreen->drawLockID);
    VALIDATE_DRAWABLE_INFO_NO_LOCK(gmesa);
#endif

    if (gmesa->dirty & GAMMA_UPLOAD_VIEWPORT) {
	gmesa->dirty &= ~GAMMA_UPLOAD_VIEWPORT;
 	CHECK_DMA_BUFFER(gmesa, 6);
 	WRITEF(gmesa->buf, ViewPortOffsetX, gmesa->ViewportOffsetX);
 	WRITEF(gmesa->buf, ViewPortOffsetY, gmesa->ViewportOffsetY);
 	WRITEF(gmesa->buf, ViewPortOffsetZ, gmesa->ViewportOffsetZ);
 	WRITEF(gmesa->buf, ViewPortScaleX, gmesa->ViewportScaleX);
 	WRITEF(gmesa->buf, ViewPortScaleY, gmesa->ViewportScaleY);
 	WRITEF(gmesa->buf, ViewPortScaleZ, gmesa->ViewportScaleZ);
    }
    if ( (gmesa->dirty & GAMMA_UPLOAD_POINTMODE) ||
	 (gmesa->dirty & GAMMA_UPLOAD_LINEMODE) ||
	 (gmesa->dirty & GAMMA_UPLOAD_TRIMODE) ) {
 	CHECK_DMA_BUFFER(gmesa, 1);
	WRITE(gmesa->buf, AntialiasMode, gmesa->AntialiasMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_POINTMODE) {
	gmesa->dirty &= ~GAMMA_UPLOAD_POINTMODE;
 	CHECK_DMA_BUFFER(gmesa, 1);
 	WRITE(gmesa->buf, PointMode, gmesa->PointMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_LINEMODE) {
	gmesa->dirty &= ~GAMMA_UPLOAD_LINEMODE;
 	CHECK_DMA_BUFFER(gmesa, 2);
 	WRITE(gmesa->buf, LineMode, gmesa->LineMode);
 	WRITE(gmesa->buf, LineStippleMode, gmesa->LineMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_TRIMODE) {
	gmesa->dirty &= ~GAMMA_UPLOAD_TRIMODE;
 	CHECK_DMA_BUFFER(gmesa, 1);
 	WRITE(gmesa->buf, TriangleMode, gmesa->TriangleMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_FOG) {
	GLchan c[3], col;
   	UNCLAMPED_FLOAT_TO_RGB_CHAN( c, gmesa->glCtx->Fog.Color );
	col = gammaPackColor(4, c[0], c[1], c[2], 0);
	gmesa->dirty &= ~GAMMA_UPLOAD_FOG;
	CHECK_DMA_BUFFER(gmesa, 5);
#if 0
	WRITE(gmesa->buf, FogMode, gmesa->FogMode);
	WRITE(gmesa->buf, FogColor, col);
	WRITEF(gmesa->buf, FStart, gmesa->glCtx->Fog.Start);
#endif
	WRITEF(gmesa->buf, FogEnd, gmesa->glCtx->Fog.End);
	WRITEF(gmesa->buf, FogDensity, gmesa->glCtx->Fog.Density);
	WRITEF(gmesa->buf, FogScale, 
		1.0f/(gmesa->glCtx->Fog.End - gmesa->glCtx->Fog.Start));
    }
    if (gmesa->dirty & GAMMA_UPLOAD_DITHER) {
	gmesa->dirty &= ~GAMMA_UPLOAD_DITHER;
	CHECK_DMA_BUFFER(gmesa, 1);
	WRITE(gmesa->buf, DitherMode, gmesa->DitherMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_LOGICOP) {
	gmesa->dirty &= ~GAMMA_UPLOAD_LOGICOP;
	CHECK_DMA_BUFFER(gmesa, 1);
	WRITE(gmesa->buf, LogicalOpMode, gmesa->LogicalOpMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_CLIP) {
	gmesa->dirty &= ~GAMMA_UPLOAD_CLIP;
	CHECK_DMA_BUFFER(gmesa, 3);
	WRITE(gmesa->buf, ScissorMinXY, gmesa->ScissorMinXY);
	WRITE(gmesa->buf, ScissorMaxXY, gmesa->ScissorMaxXY);
	WRITE(gmesa->buf, ScissorMode, gmesa->ScissorMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_MASKS) {
	gmesa->dirty &= ~GAMMA_UPLOAD_MASKS;
	CHECK_DMA_BUFFER(gmesa, 1);
	WRITE(gmesa->buf, FBHardwareWriteMask, gmesa->FBHardwareWriteMask);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_ALPHA) {
	gmesa->dirty &= ~GAMMA_UPLOAD_ALPHA;
	CHECK_DMA_BUFFER(gmesa, 1);
	WRITE(gmesa->buf, AlphaTestMode, gmesa->AlphaTestMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_BLEND) {
	gmesa->dirty &= ~GAMMA_UPLOAD_BLEND;
	CHECK_DMA_BUFFER(gmesa, 1);
	WRITE(gmesa->buf, AlphaBlendMode, gmesa->AlphaBlendMode);
    } 
    CHECK_DMA_BUFFER(gmesa, 1);
    if (gmesa->glCtx->Color.BlendEnabled || gmesa->glCtx->Color.AlphaEnabled) {
    	WRITE(gmesa->buf, FBReadMode, gmesa->FBReadMode | gmesa->AB_FBReadMode_Save);
    } else {
    	WRITE(gmesa->buf, FBReadMode, gmesa->FBReadMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_LIGHT) {
	gmesa->dirty &= ~GAMMA_UPLOAD_LIGHT;
	CHECK_DMA_BUFFER(gmesa, 2);
	WRITE(gmesa->buf, LightingMode, gmesa->LightingMode);
	WRITE(gmesa->buf, MaterialMode, gmesa->MaterialMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_SHADE) {
	gmesa->dirty &= ~GAMMA_UPLOAD_SHADE;
	CHECK_DMA_BUFFER(gmesa, 1);
	WRITE(gmesa->buf, ColorDDAMode, gmesa->ColorDDAMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_POLYGON) {
	gmesa->dirty &= ~GAMMA_UPLOAD_POLYGON;
	CHECK_DMA_BUFFER(gmesa, 2);
	WRITEF(gmesa->buf, PolygonOffsetBias, gmesa->glCtx->Polygon.OffsetUnits);
	WRITEF(gmesa->buf, PolygonOffsetFactor, gmesa->glCtx->Polygon.OffsetFactor);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_STIPPLE) {
	gmesa->dirty &= ~GAMMA_UPLOAD_STIPPLE;
	CHECK_DMA_BUFFER(gmesa, 33);
	WRITE(gmesa->buf, AreaStippleMode, gmesa->AreaStippleMode);
	WRITE(gmesa->buf, AreaStipplePattern0, gmesa->glCtx->PolygonStipple[0]);
	WRITE(gmesa->buf, AreaStipplePattern1, gmesa->glCtx->PolygonStipple[1]);
	WRITE(gmesa->buf, AreaStipplePattern2, gmesa->glCtx->PolygonStipple[2]);
	WRITE(gmesa->buf, AreaStipplePattern3, gmesa->glCtx->PolygonStipple[3]);
	WRITE(gmesa->buf, AreaStipplePattern4, gmesa->glCtx->PolygonStipple[4]);
	WRITE(gmesa->buf, AreaStipplePattern5, gmesa->glCtx->PolygonStipple[5]);
	WRITE(gmesa->buf, AreaStipplePattern6, gmesa->glCtx->PolygonStipple[6]);
	WRITE(gmesa->buf, AreaStipplePattern7, gmesa->glCtx->PolygonStipple[7]);
	WRITE(gmesa->buf, AreaStipplePattern8, gmesa->glCtx->PolygonStipple[8]);
	WRITE(gmesa->buf, AreaStipplePattern9, gmesa->glCtx->PolygonStipple[9]);
	WRITE(gmesa->buf, AreaStipplePattern10, gmesa->glCtx->PolygonStipple[10]);
	WRITE(gmesa->buf, AreaStipplePattern11, gmesa->glCtx->PolygonStipple[11]);
	WRITE(gmesa->buf, AreaStipplePattern12, gmesa->glCtx->PolygonStipple[12]);
	WRITE(gmesa->buf, AreaStipplePattern13, gmesa->glCtx->PolygonStipple[13]);
	WRITE(gmesa->buf, AreaStipplePattern14, gmesa->glCtx->PolygonStipple[14]);
	WRITE(gmesa->buf, AreaStipplePattern15, gmesa->glCtx->PolygonStipple[15]);
	WRITE(gmesa->buf, AreaStipplePattern16, gmesa->glCtx->PolygonStipple[16]);
	WRITE(gmesa->buf, AreaStipplePattern17, gmesa->glCtx->PolygonStipple[17]);
	WRITE(gmesa->buf, AreaStipplePattern18, gmesa->glCtx->PolygonStipple[18]);
	WRITE(gmesa->buf, AreaStipplePattern19, gmesa->glCtx->PolygonStipple[19]);
	WRITE(gmesa->buf, AreaStipplePattern20, gmesa->glCtx->PolygonStipple[20]);
	WRITE(gmesa->buf, AreaStipplePattern21, gmesa->glCtx->PolygonStipple[21]);
	WRITE(gmesa->buf, AreaStipplePattern22, gmesa->glCtx->PolygonStipple[22]);
	WRITE(gmesa->buf, AreaStipplePattern23, gmesa->glCtx->PolygonStipple[23]);
	WRITE(gmesa->buf, AreaStipplePattern24, gmesa->glCtx->PolygonStipple[24]);
	WRITE(gmesa->buf, AreaStipplePattern25, gmesa->glCtx->PolygonStipple[25]);
	WRITE(gmesa->buf, AreaStipplePattern26, gmesa->glCtx->PolygonStipple[26]);
	WRITE(gmesa->buf, AreaStipplePattern27, gmesa->glCtx->PolygonStipple[27]);
	WRITE(gmesa->buf, AreaStipplePattern28, gmesa->glCtx->PolygonStipple[28]);
	WRITE(gmesa->buf, AreaStipplePattern29, gmesa->glCtx->PolygonStipple[29]);
	WRITE(gmesa->buf, AreaStipplePattern30, gmesa->glCtx->PolygonStipple[30]);
	WRITE(gmesa->buf, AreaStipplePattern31, gmesa->glCtx->PolygonStipple[31]);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_DEPTH) {
	gmesa->dirty &= ~GAMMA_UPLOAD_DEPTH;
	CHECK_DMA_BUFFER(gmesa, 4);
	WRITE(gmesa->buf, DepthMode,  gmesa->DepthMode);
	WRITE(gmesa->buf, DeltaMode,  gmesa->DeltaMode);
	WRITE(gmesa->buf, GLINTWindow,gmesa->Window | (gmesa->FrameCount << 9));
	WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_GEOMETRY) {
	gmesa->dirty &= ~GAMMA_UPLOAD_GEOMETRY;
	CHECK_DMA_BUFFER(gmesa, 1);
	WRITE(gmesa->buf, GeometryMode, gmesa->GeometryMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_TRANSFORM) {
	gmesa->dirty &= ~GAMMA_UPLOAD_TRANSFORM;
	CHECK_DMA_BUFFER(gmesa, 1);
	WRITE(gmesa->buf, TransformMode, gmesa->TransformMode);
    }
    if (gmesa->dirty & GAMMA_UPLOAD_TEX0) {
	gammaTextureObjectPtr curTex = gmesa->CurrentTexObj[0];
	gmesa->dirty &= ~GAMMA_UPLOAD_TEX0;
	if (curTex) {
	CHECK_DMA_BUFFER(gmesa, 21);
	WRITE(gmesa->buf, GeometryMode, gmesa->GeometryMode | GM_TextureEnable);
	WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode | DM_TextureEnable);
	WRITE(gmesa->buf, TextureAddressMode, curTex->TextureAddressMode);
	WRITE(gmesa->buf, TextureReadMode, curTex->TextureReadMode);
	WRITE(gmesa->buf, TextureColorMode, curTex->TextureColorMode);
	WRITE(gmesa->buf, TextureFilterMode, curTex->TextureFilterMode);
	WRITE(gmesa->buf, TextureFormat, curTex->TextureFormat);
	WRITE(gmesa->buf, GLINTBorderColor, curTex->TextureBorderColor);
	WRITE(gmesa->buf, TxBaseAddr0, curTex->TextureBaseAddr[0]);
	WRITE(gmesa->buf, TxBaseAddr1, curTex->TextureBaseAddr[1]);
	WRITE(gmesa->buf, TxBaseAddr2, curTex->TextureBaseAddr[2]);
	WRITE(gmesa->buf, TxBaseAddr3, curTex->TextureBaseAddr[3]);
	WRITE(gmesa->buf, TxBaseAddr4, curTex->TextureBaseAddr[4]);
	WRITE(gmesa->buf, TxBaseAddr5, curTex->TextureBaseAddr[5]);
	WRITE(gmesa->buf, TxBaseAddr6, curTex->TextureBaseAddr[6]);
	WRITE(gmesa->buf, TxBaseAddr7, curTex->TextureBaseAddr[7]);
	WRITE(gmesa->buf, TxBaseAddr8, curTex->TextureBaseAddr[8]);
	WRITE(gmesa->buf, TxBaseAddr9, curTex->TextureBaseAddr[9]);
	WRITE(gmesa->buf, TxBaseAddr10, curTex->TextureBaseAddr[10]);
	WRITE(gmesa->buf, TxBaseAddr11, curTex->TextureBaseAddr[11]);
	WRITE(gmesa->buf, TextureCacheControl, (TCC_Enable | TCC_Invalidate));
	} else {
	CHECK_DMA_BUFFER(gmesa, 6);
	WRITE(gmesa->buf, GeometryMode, gmesa->GeometryMode);
	WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode);
	WRITE(gmesa->buf, TextureAddressMode, TextureAddressModeDisable);
	WRITE(gmesa->buf, TextureReadMode, TextureReadModeDisable);
	WRITE(gmesa->buf, TextureFilterMode, TextureFilterModeDisable);
	WRITE(gmesa->buf, TextureColorMode, TextureColorModeDisable);
	}
    }
#ifdef DO_VALIDATE
    PROCESS_DMA_BUFFER_TOP_HALF(gmesa);

    DRM_SPINUNLOCK(&gmesa->driScreen->pSAREA->drawable_lock,
		   gmesa->driScreen->drawLockID);
    VALIDATE_DRAWABLE_INFO_NO_LOCK_POST(gmesa);

    PROCESS_DMA_BUFFER_BOTTOM_HALF(gmesa);
#endif
}
示例#8
0
static void gammaLoadHWMatrix(GLcontext *ctx)
{
    gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);
    const GLfloat *m;

    gmesa->TransformMode &= ~XM_XformTexture;

    switch (ctx->Transform.MatrixMode) {
    case GL_MODELVIEW:
	gmesa->TransformMode |= XM_UseModelViewMatrix;
        m = ctx->ModelviewMatrixStack.Top->m;
	CHECK_DMA_BUFFER(gmesa, 16);
	WRITEF(gmesa->buf, ModelViewMatrix0,  m[0]);
	WRITEF(gmesa->buf, ModelViewMatrix1,  m[1]);
	WRITEF(gmesa->buf, ModelViewMatrix2,  m[2]);
	WRITEF(gmesa->buf, ModelViewMatrix3,  m[3]);
	WRITEF(gmesa->buf, ModelViewMatrix4,  m[4]);
	WRITEF(gmesa->buf, ModelViewMatrix5,  m[5]);
	WRITEF(gmesa->buf, ModelViewMatrix6,  m[6]);
	WRITEF(gmesa->buf, ModelViewMatrix7,  m[7]);
	WRITEF(gmesa->buf, ModelViewMatrix8,  m[8]);
	WRITEF(gmesa->buf, ModelViewMatrix9,  m[9]);
	WRITEF(gmesa->buf, ModelViewMatrix10, m[10]);
	WRITEF(gmesa->buf, ModelViewMatrix11, m[11]);
	WRITEF(gmesa->buf, ModelViewMatrix12, m[12]);
	WRITEF(gmesa->buf, ModelViewMatrix13, m[13]);
	WRITEF(gmesa->buf, ModelViewMatrix14, m[14]);
	WRITEF(gmesa->buf, ModelViewMatrix15, m[15]);
	break;
    case GL_PROJECTION:
        m = ctx->ProjectionMatrixStack.Top->m;
	CHECK_DMA_BUFFER(gmesa, 16);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix0, m[0]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix1, m[1]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix2, m[2]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix3, m[3]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix4, m[4]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix5, m[5]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix6, m[6]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix7, m[7]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix8, m[8]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix9, m[9]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix10, m[10]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix11, m[11]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix12, m[12]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix13, m[13]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix14, m[14]);
	WRITEF(gmesa->buf, ModelViewProjectionMatrix15, m[15]);
	break;
    case GL_TEXTURE:
        m = ctx->TextureMatrixStack[0].Top->m;
	CHECK_DMA_BUFFER(gmesa, 16);
	gmesa->TransformMode |= XM_XformTexture;
	WRITEF(gmesa->buf, TextureMatrix0,  m[0]);
	WRITEF(gmesa->buf, TextureMatrix1,  m[1]);
	WRITEF(gmesa->buf, TextureMatrix2,  m[2]);
	WRITEF(gmesa->buf, TextureMatrix3,  m[3]);
	WRITEF(gmesa->buf, TextureMatrix4,  m[4]);
	WRITEF(gmesa->buf, TextureMatrix5,  m[5]);
	WRITEF(gmesa->buf, TextureMatrix6,  m[6]);
	WRITEF(gmesa->buf, TextureMatrix7,  m[7]);
	WRITEF(gmesa->buf, TextureMatrix8,  m[8]);
	WRITEF(gmesa->buf, TextureMatrix9,  m[9]);
	WRITEF(gmesa->buf, TextureMatrix10,  m[10]);
	WRITEF(gmesa->buf, TextureMatrix11,  m[11]);
	WRITEF(gmesa->buf, TextureMatrix12,  m[12]);
	WRITEF(gmesa->buf, TextureMatrix13,  m[13]);
	WRITEF(gmesa->buf, TextureMatrix14,  m[14]);
	WRITEF(gmesa->buf, TextureMatrix15,  m[15]);
	break;

    default:
	/* ERROR!!! -- how did this happen? */
	break;
    }

    gmesa->dirty |= GAMMA_UPLOAD_TRANSFORM;
}
示例#9
0
void gammaInitHW( gammaContextPtr gmesa )
{
    GLINTDRIPtr gDRIPriv = (GLINTDRIPtr)gmesa->driScreen->pDevPriv;
    int i;

    if (gDRIPriv->numMultiDevices == 2) {
	/* Set up each MX's ScanLineOwnership for OpenGL */
	CHECK_DMA_BUFFER(gmesa, 5);
	WRITE(gmesa->buf, BroadcastMask, 1);
	WRITE(gmesa->buf, ScanLineOwnership, 5); /* Use bottom left as [0,0] */
	WRITE(gmesa->buf, BroadcastMask, 2);
	WRITE(gmesa->buf, ScanLineOwnership, 1); /* Use bottom left as [0,0] */
	/* Broadcast to both MX's */
	WRITE(gmesa->buf, BroadcastMask, 3);
	FLUSH_DMA_BUFFER(gmesa); 
    }

    gmesa->AlphaBlendMode = (AlphaBlendModeDisable |
			     AB_Src_One |
			     AB_Dst_Zero |
			     AB_NoAlphaBufferPresent |
			     AB_ColorFmt_8888 |
			     AB_ColorOrder_RGB |
			     AB_OpenGLType |
			     AB_AlphaDst_FBData |
			     AB_ColorConversionScale |
			     AB_AlphaConversionScale);

    gmesa->DitherMode = DitherModeEnable | DM_ColorOrder_RGB;

    switch (gmesa->gammaScreen->cpp) {
	case 2:
    		gmesa->DitherMode |= DM_ColorFmt_5555;
		gmesa->AlphaBlendMode |= AB_ColorFmt_5555;
		CHECK_DMA_BUFFER(gmesa, 1);
		WRITE(gmesa->buf, PixelSize, 1);
		break;
	case 4:
    		gmesa->DitherMode |= DM_ColorFmt_8888;
		gmesa->AlphaBlendMode |= AB_ColorFmt_8888;
		WRITE(gmesa->buf, PixelSize, 0);
		break;
    }

    /* FIXME for stencil, gid, etc */
    switch (gmesa->DepthSize) {
	case 16:
   		gmesa->LBReadFormat = 
			 (LBRF_DepthWidth16    | 
                          LBRF_StencilWidth8   |
                          LBRF_StencilPos16    |
                          LBRF_FrameCount8     |
                          LBRF_FrameCountPos24 |
                          LBRF_GIDWidth4       |
                          LBRF_GIDPos32         );
   		gmesa->LBWriteFormat = 
			 (LBRF_DepthWidth16    | 
                          LBRF_StencilWidth8   |
                          LBRF_StencilPos16    |
                          LBRF_FrameCount8     |
                          LBRF_FrameCountPos24 |
                          LBRF_GIDWidth4       |
                          LBRF_GIDPos32         );
		break;
	case 24:
   		gmesa->LBReadFormat = 
			 (LBRF_DepthWidth24    | 
                          LBRF_StencilWidth8   |
                          LBRF_StencilPos24    |
                          LBRF_FrameCount8     |
                          LBRF_FrameCountPos32 |
                          LBRF_GIDWidth4       |
                          LBRF_GIDPos36         );
   		gmesa->LBWriteFormat = 
			 (LBRF_DepthWidth24    | 
                          LBRF_StencilWidth8   |
                          LBRF_StencilPos24    |
                          LBRF_FrameCount8     |
                          LBRF_FrameCountPos32 |
                          LBRF_GIDWidth4       |
                          LBRF_GIDPos36         );
		break;
	case 32:
   		gmesa->LBReadFormat = 
			 (LBRF_DepthWidth32    | 
                          LBRF_StencilWidth8   |
                          LBRF_StencilPos32    |
                          LBRF_FrameCount8     |
                          LBRF_FrameCountPos40 |
                          LBRF_GIDWidth4       |
                          LBRF_GIDPos44         );
   		gmesa->LBWriteFormat = 
			 (LBRF_DepthWidth32    | 
                          LBRF_StencilWidth8   |
                          LBRF_StencilPos32    |
                          LBRF_FrameCount8     |
                          LBRF_FrameCountPos40 |
                          LBRF_GIDWidth4       |
                          LBRF_GIDPos44         );
		break;
    }

    gmesa->FBHardwareWriteMask = 0xffffffff;
    gmesa->FogMode = FogModeDisable;
    gmesa->ClearDepth = 0xffffffff;
    gmesa->AreaStippleMode = AreaStippleModeDisable;
    gmesa->x = 0;
    gmesa->y = 0;
    gmesa->w = 0;
    gmesa->h = 0;
    gmesa->FrameCount = 0;
    gmesa->MatrixMode = GL_MODELVIEW;
    gmesa->ModelViewCount = 0;
    gmesa->ProjCount = 0;
    gmesa->TextureCount = 0;
    gmesa->PointMode = PM_AntialiasQuality_4x4;
    gmesa->LineMode = LM_AntialiasQuality_4x4;
    gmesa->TriangleMode = TM_AntialiasQuality_4x4;
    gmesa->AntialiasMode = AntialiasModeDisable;

    for (i = 0; i < 16; i++)
	if (i % 5 == 0)
	    gmesa->ModelView[i] =
		gmesa->Proj[i] =
		gmesa->ModelViewProj[i] =
		gmesa->Texture[i] = 1.0;
	else
	    gmesa->ModelView[i] =
		gmesa->Proj[i] =
		gmesa->ModelViewProj[i] =
		gmesa->Texture[i] = 0.0;

    gmesa->LBReadMode = (LBReadSrcDisable |
			 LBReadDstDisable |
			 LBDataTypeDefault |
			 LBWindowOriginBot | 
			 gDRIPriv->pprod);
    gmesa->FBReadMode = (FBReadSrcDisable |
			 FBReadDstDisable |
			 FBDataTypeDefault |
			 FBWindowOriginBot |  
			 gDRIPriv->pprod);
 
    if (gDRIPriv->numMultiDevices == 2) {
	gmesa->LBReadMode |= LBScanLineInt2;
	gmesa->FBReadMode |= FBScanLineInt2;
        gmesa->LBWindowBase = gmesa->driScreen->fbWidth *
			     (gmesa->driScreen->fbHeight/2 - 1);
    	gmesa->FBWindowBase = gmesa->driScreen->fbWidth * 
			     (gmesa->driScreen->fbHeight/2 - 1);
    } else {
        gmesa->LBWindowBase = gmesa->driScreen->fbWidth *
			     (gmesa->driScreen->fbHeight - 1);
    	gmesa->FBWindowBase = gmesa->driScreen->fbWidth * 
			     (gmesa->driScreen->fbHeight - 1);
    }

    gmesa->Begin = (B_AreaStippleDisable |
		    B_LineStippleDisable |
		    B_AntiAliasDisable |
		    B_TextureDisable |
		    B_FogDisable |
		    B_SubPixelCorrectEnable |
		    B_PrimType_Null);

    gmesa->ColorDDAMode = (ColorDDAEnable |
			   ColorDDAGouraud);

    gmesa->GeometryMode = (GM_TextureDisable |
			   GM_FogDisable |
			   GM_FogExp |
			   GM_FrontPolyFill |
			   GM_BackPolyFill |
			   GM_FrontFaceCCW |
			   GM_PolyCullDisable |
			   GM_PolyCullBack |
			   GM_ClipShortLinesDisable |
			   GM_ClipSmallTrisDisable |
			   GM_RenderMode |
			   GM_Feedback2D |
			   GM_CullFaceNormDisable |
			   GM_AutoFaceNormDisable |
			   GM_GouraudShading |
			   GM_UserClipNone |
			   GM_PolyOffsetPointDisable |
			   GM_PolyOffsetLineDisable |
			   GM_PolyOffsetFillDisable |
			   GM_InvertFaceNormCullDisable);

    gmesa->AlphaTestMode = (AlphaTestModeDisable |
			    AT_Always);

    gmesa->AB_FBReadMode_Save = gmesa->AB_FBReadMode = 0;

    gmesa->Window = (WindowEnable  | /* For GID testing */
		     W_PassIfEqual |
		     (0 << 5)); /* GID part is set from draw priv (below) */

    gmesa->NotClipped = GL_FALSE;
    gmesa->WindowChanged = GL_TRUE;

    gmesa->Texture1DEnabled = GL_FALSE;
    gmesa->Texture2DEnabled = GL_FALSE;

    gmesa->DepthMode |= (DepthModeDisable |
			DM_WriteMask |
			DM_Less);

    gmesa->DeltaMode |= (DM_SubPixlCorrectionEnable |
			DM_SmoothShadingEnable |
			DM_Target500TXMX);

    gmesa->LightingMode = LightingModeDisable | LightingModeSpecularEnable;
    gmesa->Light0Mode = LNM_Off;
    gmesa->Light1Mode = LNM_Off;
    gmesa->Light2Mode = LNM_Off;
    gmesa->Light3Mode = LNM_Off;
    gmesa->Light4Mode = LNM_Off;
    gmesa->Light5Mode = LNM_Off;
    gmesa->Light6Mode = LNM_Off;
    gmesa->Light7Mode = LNM_Off;
    gmesa->Light8Mode = LNM_Off;
    gmesa->Light9Mode = LNM_Off;
    gmesa->Light10Mode = LNM_Off;
    gmesa->Light11Mode = LNM_Off;
    gmesa->Light12Mode = LNM_Off;
    gmesa->Light13Mode = LNM_Off;
    gmesa->Light14Mode = LNM_Off;
    gmesa->Light15Mode = LNM_Off;

    gmesa->LogicalOpMode = LogicalOpModeDisable;

    gmesa->MaterialMode = MaterialModeDisable;

    gmesa->ScissorMode = UserScissorDisable | ScreenScissorDisable;

    gmesa->TransformMode = XM_UseModelViewProjMatrix |
				    XM_TexGenModeS_None |
				    XM_TexGenModeT_None |
				    XM_TexGenModeR_None |
				    XM_TexGenModeQ_None;

    CHECK_DMA_BUFFER(gmesa, 20);
    WRITE(gmesa->buf, LineStippleMode, 0);
    WRITE(gmesa->buf, RouterMode, 0);
    WRITE(gmesa->buf, TextureAddressMode, 0);
    WRITE(gmesa->buf, TextureReadMode, 0);
    WRITE(gmesa->buf, TextureFilterMode, 0);
    WRITE(gmesa->buf, TextureColorMode, 0);
    WRITE(gmesa->buf, StencilMode, 0);
    WRITE(gmesa->buf, PatternRamMode, 0);
    WRITE(gmesa->buf, ChromaTestMode, 0);
    WRITE(gmesa->buf, StatisticMode, 0);
    WRITE(gmesa->buf, AreaStippleMode, gmesa->AreaStippleMode);
    WRITE(gmesa->buf, ScissorMode, gmesa->ScissorMode);
    WRITE(gmesa->buf, FogMode, gmesa->FogMode);
    WRITE(gmesa->buf, AntialiasMode, gmesa->AntialiasMode);
    WRITE(gmesa->buf, LogicalOpMode, gmesa->LogicalOpMode);
    WRITE(gmesa->buf, TriangleMode, gmesa->TriangleMode);
    WRITE(gmesa->buf, PointMode, gmesa->PointMode);
    WRITE(gmesa->buf, LineMode, gmesa->LineMode);
    WRITE(gmesa->buf, LBWriteFormat, gmesa->LBWriteFormat);
    WRITE(gmesa->buf, LBReadFormat,  gmesa->LBReadFormat);

    /* Framebuffer initialization */
    CHECK_DMA_BUFFER(gmesa, 10);
    WRITE(gmesa->buf, FBSourceData, 0);
    WRITE(gmesa->buf, FBReadMode, gmesa->FBReadMode);
    if (gmesa->EnabledFlags & GAMMA_BACK_BUFFER) {
	if (gDRIPriv->numMultiDevices == 2) {
	    WRITE(gmesa->buf, FBPixelOffset,
	      (gmesa->driScreen->fbHeight/2)*gmesa->driScreen->fbWidth);
	} else {
	    WRITE(gmesa->buf, FBPixelOffset,
	      gmesa->driScreen->fbHeight*gmesa->driScreen->fbWidth);
	}
    } else
	WRITE(gmesa->buf, FBPixelOffset, 0);
    WRITE(gmesa->buf, FBSourceOffset, 0);
    WRITE(gmesa->buf, FBHardwareWriteMask, 0xffffffff);
    WRITE(gmesa->buf, FBSoftwareWriteMask, 0xffffffff);
    WRITE(gmesa->buf, FBWriteMode, FBWriteModeEnable);
    WRITE(gmesa->buf, FBWindowBase, gmesa->FBWindowBase);
    WRITE(gmesa->buf, ScreenSize, ((gmesa->driScreen->fbHeight << 16) |
				 (gmesa->driScreen->fbWidth)));
    WRITE(gmesa->buf, WindowOrigin, 0x00000000);

    /* Localbuffer initialization */
    CHECK_DMA_BUFFER(gmesa, 5);
    WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode);
    WRITE(gmesa->buf, LBSourceOffset, 0);
    WRITE(gmesa->buf, LBWriteMode, LBWriteModeEnable);
    WRITE(gmesa->buf, LBWindowOffset, 0);
    WRITE(gmesa->buf, LBWindowBase, gmesa->LBWindowBase);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, Rectangle2DControl, 1);

    CHECK_DMA_BUFFER(gmesa, 11);
    WRITE(gmesa->buf, DepthMode, gmesa->DepthMode);
    WRITE(gmesa->buf, ColorDDAMode, gmesa->ColorDDAMode);
    WRITE(gmesa->buf, FBBlockColor, 0x00000000);
    WRITE(gmesa->buf, ConstantColor, 0x00000000);
    WRITE(gmesa->buf, AlphaTestMode, gmesa->AlphaTestMode);
    WRITE(gmesa->buf, AlphaBlendMode, gmesa->AlphaBlendMode);
    WRITE(gmesa->buf, DitherMode, gmesa->DitherMode);
    if (gDRIPriv->numMultiDevices == 2)
    	WRITE(gmesa->buf, RasterizerMode, RM_MultiGLINT | RM_BiasCoordNearHalf);
    else
    	WRITE(gmesa->buf, RasterizerMode, RM_BiasCoordNearHalf);
    WRITE(gmesa->buf, GLINTWindow, gmesa->Window);
    WRITE(gmesa->buf, FastClearDepth, gmesa->ClearDepth);
    WRITE(gmesa->buf, GLINTDepth, gmesa->ClearDepth);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, EdgeFlag, EdgeFlagEnable);

    CHECK_DMA_BUFFER(gmesa, 16);
    WRITEF(gmesa->buf, ModelViewMatrix0,  1.0);
    WRITEF(gmesa->buf, ModelViewMatrix1,  0.0);
    WRITEF(gmesa->buf, ModelViewMatrix2,  0.0);
    WRITEF(gmesa->buf, ModelViewMatrix3,  0.0);
    WRITEF(gmesa->buf, ModelViewMatrix4,  0.0);
    WRITEF(gmesa->buf, ModelViewMatrix5,  1.0);
    WRITEF(gmesa->buf, ModelViewMatrix6,  0.0);
    WRITEF(gmesa->buf, ModelViewMatrix7,  0.0);
    WRITEF(gmesa->buf, ModelViewMatrix8,  0.0);
    WRITEF(gmesa->buf, ModelViewMatrix9,  0.0);
    WRITEF(gmesa->buf, ModelViewMatrix10, 1.0);
    WRITEF(gmesa->buf, ModelViewMatrix11, 0.0);
    WRITEF(gmesa->buf, ModelViewMatrix12, 0.0);
    WRITEF(gmesa->buf, ModelViewMatrix13, 0.0);
    WRITEF(gmesa->buf, ModelViewMatrix14, 0.0);
    WRITEF(gmesa->buf, ModelViewMatrix15, 1.0);

    CHECK_DMA_BUFFER(gmesa, 16);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix0,  1.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix1,  0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix2,  0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix3,  0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix4,  0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix5,  1.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix6,  0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix7,  0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix8,  0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix9,  0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix10, 1.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix11, 0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix12, 0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix13, 0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix14, 0.0);
    WRITEF(gmesa->buf, ModelViewProjectionMatrix15, 1.0);

    CHECK_DMA_BUFFER(gmesa, 16);
    WRITEF(gmesa->buf, TextureMatrix0,  1.0);
    WRITEF(gmesa->buf, TextureMatrix1,  0.0);
    WRITEF(gmesa->buf, TextureMatrix2,  0.0);
    WRITEF(gmesa->buf, TextureMatrix3,  0.0);
    WRITEF(gmesa->buf, TextureMatrix4,  0.0);
    WRITEF(gmesa->buf, TextureMatrix5,  1.0);
    WRITEF(gmesa->buf, TextureMatrix6,  0.0);
    WRITEF(gmesa->buf, TextureMatrix7,  0.0);
    WRITEF(gmesa->buf, TextureMatrix8,  0.0);
    WRITEF(gmesa->buf, TextureMatrix9,  0.0);
    WRITEF(gmesa->buf, TextureMatrix10, 1.0);
    WRITEF(gmesa->buf, TextureMatrix11, 0.0);
    WRITEF(gmesa->buf, TextureMatrix12, 0.0);
    WRITEF(gmesa->buf, TextureMatrix13, 0.0);
    WRITEF(gmesa->buf, TextureMatrix14, 0.0);
    WRITEF(gmesa->buf, TextureMatrix15, 1.0);

    CHECK_DMA_BUFFER(gmesa, 16);
    WRITEF(gmesa->buf, TexGen0,  0.0);
    WRITEF(gmesa->buf, TexGen1,  0.0);
    WRITEF(gmesa->buf, TexGen2,  0.0);
    WRITEF(gmesa->buf, TexGen3,  0.0);
    WRITEF(gmesa->buf, TexGen4,  0.0);
    WRITEF(gmesa->buf, TexGen5,  0.0);
    WRITEF(gmesa->buf, TexGen6,  0.0);
    WRITEF(gmesa->buf, TexGen7,  0.0);
    WRITEF(gmesa->buf, TexGen8,  0.0);
    WRITEF(gmesa->buf, TexGen9,  0.0);
    WRITEF(gmesa->buf, TexGen10, 0.0);
    WRITEF(gmesa->buf, TexGen11, 0.0);
    WRITEF(gmesa->buf, TexGen12, 0.0);
    WRITEF(gmesa->buf, TexGen13, 0.0);
    WRITEF(gmesa->buf, TexGen14, 0.0);
    WRITEF(gmesa->buf, TexGen15, 0.0);

    CHECK_DMA_BUFFER(gmesa, 9);
    WRITEF(gmesa->buf, NormalMatrix0, 1.0);
    WRITEF(gmesa->buf, NormalMatrix1, 0.0);
    WRITEF(gmesa->buf, NormalMatrix2, 0.0);
    WRITEF(gmesa->buf, NormalMatrix3, 0.0);
    WRITEF(gmesa->buf, NormalMatrix4, 1.0);
    WRITEF(gmesa->buf, NormalMatrix5, 0.0);
    WRITEF(gmesa->buf, NormalMatrix6, 0.0);
    WRITEF(gmesa->buf, NormalMatrix7, 0.0);
    WRITEF(gmesa->buf, NormalMatrix8, 1.0);

    CHECK_DMA_BUFFER(gmesa, 3);
    WRITEF(gmesa->buf, FogDensity, 0.0);
    WRITEF(gmesa->buf, FogEnd,     0.0);
    WRITEF(gmesa->buf, FogScale,   0.0);

    CHECK_DMA_BUFFER(gmesa, 2);
    WRITEF(gmesa->buf, LineClipLengthThreshold,   0.0);
    WRITEF(gmesa->buf, TriangleClipAreaThreshold, 0.0);

    CHECK_DMA_BUFFER(gmesa, 5);
    WRITE(gmesa->buf, GeometryMode, gmesa->GeometryMode);
    WRITE(gmesa->buf, NormalizeMode, NormalizeModeDisable);
    WRITE(gmesa->buf, LightingMode, gmesa->LightingMode);
    WRITE(gmesa->buf, ColorMaterialMode, ColorMaterialModeDisable);
    WRITE(gmesa->buf, MaterialMode, MaterialModeDisable);

    CHECK_DMA_BUFFER(gmesa, 2);
    WRITE(gmesa->buf, FrontSpecularExponent, 0); /* fixed point */
    WRITE(gmesa->buf, BackSpecularExponent,  0); /* fixed point */

    CHECK_DMA_BUFFER(gmesa, 29);
    WRITEF(gmesa->buf, FrontAmbientColorRed,    0.2);
    WRITEF(gmesa->buf, FrontAmbientColorGreen,  0.2);
    WRITEF(gmesa->buf, FrontAmbientColorBlue,   0.2);
    WRITEF(gmesa->buf, BackAmbientColorRed,     0.2);
    WRITEF(gmesa->buf, BackAmbientColorGreen,   0.2);
    WRITEF(gmesa->buf, BackAmbientColorBlue,    0.2);
    WRITEF(gmesa->buf, FrontDiffuseColorRed,    0.8);
    WRITEF(gmesa->buf, FrontDiffuseColorGreen,  0.8);
    WRITEF(gmesa->buf, FrontDiffuseColorBlue,   0.8);
    WRITEF(gmesa->buf, BackDiffuseColorRed,     0.8);
    WRITEF(gmesa->buf, BackDiffuseColorGreen,   0.8);
    WRITEF(gmesa->buf, BackDiffuseColorBlue,    0.8);
    WRITEF(gmesa->buf, FrontSpecularColorRed,   0.0);
    WRITEF(gmesa->buf, FrontSpecularColorGreen, 0.0);
    WRITEF(gmesa->buf, FrontSpecularColorBlue,  0.0);
    WRITEF(gmesa->buf, BackSpecularColorRed,    0.0);
    WRITEF(gmesa->buf, BackSpecularColorGreen,  0.0);
    WRITEF(gmesa->buf, BackSpecularColorBlue,   0.0);
    WRITEF(gmesa->buf, FrontEmissiveColorRed,   0.0);
    WRITEF(gmesa->buf, FrontEmissiveColorGreen, 0.0);
    WRITEF(gmesa->buf, FrontEmissiveColorBlue,  0.0);
    WRITEF(gmesa->buf, BackEmissiveColorRed,    0.0);
    WRITEF(gmesa->buf, BackEmissiveColorGreen,  0.0);
    WRITEF(gmesa->buf, BackEmissiveColorBlue,   0.0);
    WRITEF(gmesa->buf, SceneAmbientColorRed,    0.2);
    WRITEF(gmesa->buf, SceneAmbientColorGreen,  0.2);
    WRITEF(gmesa->buf, SceneAmbientColorBlue,   0.2);
    WRITEF(gmesa->buf, FrontAlpha,              1.0);
    WRITEF(gmesa->buf, BackAlpha,               1.0);

    CHECK_DMA_BUFFER(gmesa, 7);
    WRITE(gmesa->buf, PointSize, 1);
    WRITEF(gmesa->buf, AApointSize, 1.0);
    WRITE(gmesa->buf, LineWidth, 1);
    WRITEF(gmesa->buf, AAlineWidth, 1.0);
    WRITE(gmesa->buf, LineWidthOffset, 0);
    WRITE(gmesa->buf, TransformMode, gmesa->TransformMode);
    WRITE(gmesa->buf, DeltaMode, gmesa->DeltaMode);

    CHECK_DMA_BUFFER(gmesa, 16);
    WRITE(gmesa->buf, Light0Mode,  LNM_Off);
    WRITE(gmesa->buf, Light1Mode,  LNM_Off);
    WRITE(gmesa->buf, Light2Mode,  LNM_Off);
    WRITE(gmesa->buf, Light3Mode,  LNM_Off);
    WRITE(gmesa->buf, Light4Mode,  LNM_Off);
    WRITE(gmesa->buf, Light5Mode,  LNM_Off);
    WRITE(gmesa->buf, Light6Mode,  LNM_Off);
    WRITE(gmesa->buf, Light7Mode,  LNM_Off);
    WRITE(gmesa->buf, Light8Mode,  LNM_Off);
    WRITE(gmesa->buf, Light9Mode,  LNM_Off);
    WRITE(gmesa->buf, Light10Mode, LNM_Off);
    WRITE(gmesa->buf, Light11Mode, LNM_Off);
    WRITE(gmesa->buf, Light12Mode, LNM_Off);
    WRITE(gmesa->buf, Light13Mode, LNM_Off);
    WRITE(gmesa->buf, Light14Mode, LNM_Off);
    WRITE(gmesa->buf, Light15Mode, LNM_Off);

    CHECK_DMA_BUFFER(gmesa, 22);
    WRITEF(gmesa->buf, Light0AmbientIntensityBlue, 0.0);
    WRITEF(gmesa->buf, Light0AmbientIntensityGreen, 0.0);
    WRITEF(gmesa->buf, Light0AmbientIntensityRed, 0.0);
    WRITEF(gmesa->buf, Light0DiffuseIntensityBlue, 1.0);
    WRITEF(gmesa->buf, Light0DiffuseIntensityGreen, 1.0);
    WRITEF(gmesa->buf, Light0DiffuseIntensityRed, 1.0);
    WRITEF(gmesa->buf, Light0SpecularIntensityBlue, 1.0);
    WRITEF(gmesa->buf, Light0SpecularIntensityGreen, 1.0);
    WRITEF(gmesa->buf, Light0SpecularIntensityRed, 1.0);
    WRITEF(gmesa->buf, Light0SpotlightDirectionZ, 0.0);
    WRITEF(gmesa->buf, Light0SpotlightDirectionY, 0.0);
    WRITEF(gmesa->buf, Light0SpotlightDirectionX, -1.0);
    WRITEF(gmesa->buf, Light0SpotlightExponent, 0.0);
    WRITEF(gmesa->buf, Light0PositionZ, 0.0);
    WRITEF(gmesa->buf, Light0PositionY, 0.0);
    WRITEF(gmesa->buf, Light0PositionX, 1.0);
    WRITEF(gmesa->buf, Light0PositionW, 0.0);
    WRITEF(gmesa->buf, Light0CosSpotlightCutoffAngle, -1.0);
    WRITEF(gmesa->buf, Light0ConstantAttenuation, 1.0);
    WRITEF(gmesa->buf, Light0LinearAttenuation,   0.0);
    WRITEF(gmesa->buf, Light0QuadraticAttenuation,0.0);

    CHECK_DMA_BUFFER(gmesa, 2);
    WRITEF(gmesa->buf, XBias, 0.0);
    WRITEF(gmesa->buf, YBias, 0.0);

    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, ViewPortScaleX, gmesa->driScreen->fbWidth/4);
    WRITEF(gmesa->buf, ViewPortScaleY, gmesa->driScreen->fbHeight/4);
    WRITEF(gmesa->buf, ViewPortScaleZ, 1.0f);
    WRITEF(gmesa->buf, ViewPortOffsetX, gmesa->x);
    WRITEF(gmesa->buf, ViewPortOffsetY, gmesa->y);
    WRITEF(gmesa->buf, ViewPortOffsetZ, 0.0f);

    CHECK_DMA_BUFFER(gmesa, 3);
    WRITEF(gmesa->buf, Nz, 1.0);
    WRITEF(gmesa->buf, Ny, 0.0);
    WRITEF(gmesa->buf, Nx, 0.0);

    /* Send the initialization commands to the HW */
    FLUSH_DMA_BUFFER(gmesa);
}