⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 savagestate.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
	CLAMPED_FLOAT_TO_UBYTE(alphaRef,ctx->Color.AlphaRef);                 switch(ctx->Color.AlphaFunc)  { 	case GL_NEVER: a = CF_Never; break;	case GL_ALWAYS: a = CF_Always; break;	case GL_LESS: a = CF_Less; break; 	case GL_LEQUAL: a = CF_LessEqual; break;	case GL_EQUAL: a = CF_Equal; break;	case GL_GREATER: a = CF_Greater; break;	case GL_GEQUAL: a = CF_GreaterEqual; break;	case GL_NOTEQUAL: a = CF_NotEqual; break;	default:return;        }   	imesa->regs.s3d.drawCtrl.ni.alphaTestEn = GL_TRUE;	imesa->regs.s3d.drawCtrl.ni.alphaTestCmpFunc = a;	imesa->regs.s3d.drawCtrl.ni.alphaRefVal = alphaRef;    }    else    {	imesa->regs.s3d.drawCtrl.ni.alphaTestEn = GL_FALSE;    }    /* Set/Reset Z-after-alpha*/    imesa->regs.s3d.zBufCtrl.ni.wrZafterAlphaTst =	imesa->regs.s3d.drawCtrl.ni.alphaTestEn;    if (drawCtrl != imesa->regs.s3d.drawCtrl.ui ||	zBufCtrl != imesa->regs.s3d.zBufCtrl.ui)	imesa->dirty |= SAVAGE_UPLOAD_LOCAL;}static void savageDDBlendFuncSeparate_s4( GLcontext *ctx, GLenum sfactorRGB, 					  GLenum dfactorRGB, GLenum sfactorA,					  GLenum dfactorA ){    assert (dfactorRGB == dfactorA && sfactorRGB == sfactorA);    savageBlendFunc_s4( ctx );}static void savageDDBlendFuncSeparate_s3d( GLcontext *ctx, GLenum sfactorRGB, 					   GLenum dfactorRGB, GLenum sfactorA,					   GLenum dfactorA ){    assert (dfactorRGB == dfactorA && sfactorRGB == sfactorA);    savageBlendFunc_s3d( ctx );}static void savageDDDepthFunc_s4(GLcontext *ctx, GLenum func){    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);    ZCmpFunc zmode;    u_int32_t drawLocalCtrl = imesa->regs.s4.drawLocalCtrl.ui;    u_int32_t zBufCtrl = imesa->regs.s4.zBufCtrl.ui;    u_int32_t zWatermarks = imesa->regs.s4.zWatermarks.ui; /* FIXME: in DRM */    /* set up z-buffer control register (global)     * set up z-buffer offset register (global)     * set up z read/write watermarks register (global)     */    switch(func)  { /* reversed (see savageCalcViewport) */    case GL_NEVER: zmode = CF_Never; break;    case GL_ALWAYS: zmode = CF_Always; break;    case GL_LESS: zmode = CF_Greater; break;     case GL_LEQUAL: zmode = CF_GreaterEqual; break;    case GL_EQUAL: zmode = CF_Equal; break;    case GL_GREATER: zmode = CF_Less; break;    case GL_GEQUAL: zmode = CF_LessEqual; break;    case GL_NOTEQUAL: zmode = CF_NotEqual; break;    default:return;    }     if (ctx->Depth.Test)    {	imesa->regs.s4.zBufCtrl.ni.zCmpFunc = zmode;	imesa->regs.s4.drawLocalCtrl.ni.zUpdateEn = ctx->Depth.Mask;	imesa->regs.s4.drawLocalCtrl.ni.flushPdZbufWrites = GL_TRUE;	imesa->regs.s4.zBufCtrl.ni.zBufEn = GL_TRUE;    }    else if (imesa->glCtx->Stencil.Enabled && imesa->hw_stencil)    {        /* Need to keep Z on for Stencil. */	imesa->regs.s4.zBufCtrl.ni.zCmpFunc = CF_Always;	imesa->regs.s4.zBufCtrl.ni.zBufEn   = GL_TRUE;	imesa->regs.s4.drawLocalCtrl.ni.zUpdateEn = GL_FALSE;	imesa->regs.s4.drawLocalCtrl.ni.flushPdZbufWrites = GL_FALSE;    }    else    {        if (imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn == GL_FALSE)        {            imesa->regs.s4.zBufCtrl.ni.zCmpFunc = CF_Always;            imesa->regs.s4.zBufCtrl.ni.zBufEn   = GL_TRUE;        }        else            /* DRAWUPDATE_REQUIRES_Z_ENABLED*/        {	    imesa->regs.s4.zBufCtrl.ni.zBufEn         = GL_FALSE;        }	imesa->regs.s4.drawLocalCtrl.ni.zUpdateEn = GL_FALSE;	imesa->regs.s4.drawLocalCtrl.ni.flushPdZbufWrites = GL_FALSE;    }    if (drawLocalCtrl != imesa->regs.s4.drawLocalCtrl.ui)	imesa->dirty |= SAVAGE_UPLOAD_LOCAL;    if (zBufCtrl != imesa->regs.s4.zBufCtrl.ui ||	zWatermarks != imesa->regs.s4.zWatermarks.ui)	imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;}static void savageDDDepthFunc_s3d(GLcontext *ctx, GLenum func){    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);    ZCmpFunc zmode;    u_int32_t drawCtrl = imesa->regs.s3d.drawCtrl.ui;    u_int32_t zBufCtrl = imesa->regs.s3d.zBufCtrl.ui;    u_int32_t zWatermarks = imesa->regs.s3d.zWatermarks.ui; /* FIXME: in DRM */    /* set up z-buffer control register (global)     * set up z-buffer offset register (global)     * set up z read/write watermarks register (global)     */    switch(func)  { /* reversed (see savageCalcViewport) */    case GL_NEVER: zmode = CF_Never; break;    case GL_ALWAYS: zmode = CF_Always; break;    case GL_LESS: zmode = CF_Greater; break;     case GL_LEQUAL: zmode = CF_GreaterEqual; break;    case GL_EQUAL: zmode = CF_Equal; break;    case GL_GREATER: zmode = CF_Less; break;    case GL_GEQUAL: zmode = CF_LessEqual; break;    case GL_NOTEQUAL: zmode = CF_NotEqual; break;    default:return;    }     if (ctx->Depth.Test)    {	imesa->regs.s3d.zBufCtrl.ni.zBufEn = GL_TRUE;	imesa->regs.s3d.zBufCtrl.ni.zCmpFunc = zmode;	imesa->regs.s3d.zBufCtrl.ni.zUpdateEn = ctx->Depth.Mask;		imesa->regs.s3d.drawCtrl.ni.flushPdZbufWrites = GL_TRUE;    }    else    {	if (imesa->regs.s3d.zBufCtrl.ni.drawUpdateEn == GL_FALSE) {	    imesa->regs.s3d.zBufCtrl.ni.zCmpFunc = CF_Always;            imesa->regs.s3d.zBufCtrl.ni.zBufEn = GL_TRUE;	}        else            /* DRAWUPDATE_REQUIRES_Z_ENABLED*/        {	    imesa->regs.s3d.zBufCtrl.ni.zBufEn = GL_FALSE;        }	imesa->regs.s3d.zBufCtrl.ni.zUpdateEn = GL_FALSE;	imesa->regs.s3d.drawCtrl.ni.flushPdZbufWrites = GL_FALSE;    }      if (drawCtrl != imesa->regs.s3d.drawCtrl.ui ||	zBufCtrl != imesa->regs.s3d.zBufCtrl.ui)	imesa->dirty |= SAVAGE_UPLOAD_LOCAL;    if (zWatermarks != imesa->regs.s3d.zWatermarks.ui)	imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;}static void savageDDDepthMask_s4(GLcontext *ctx, GLboolean flag){    savageDDDepthFunc_s4(ctx,ctx->Depth.Func);}static void savageDDDepthMask_s3d(GLcontext *ctx, GLboolean flag){    savageDDDepthFunc_s3d(ctx,ctx->Depth.Func);}/* ============================================================= * Hardware clipping */static void savageDDScissor( GLcontext *ctx, GLint x, GLint y,                              GLsizei w, GLsizei h ){    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);    /* Emit buffered commands with old scissor state. */    FLUSH_BATCH(imesa);    /* Mirror scissors in private context. */    imesa->scissor.enabled = ctx->Scissor.Enabled;    imesa->scissor.x = x;    imesa->scissor.y = y;    imesa->scissor.w = w;    imesa->scissor.h = h;}static void savageDDDrawBuffer(GLcontext *ctx, GLenum mode ){    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);    u_int32_t destCtrl = imesa->regs.s4.destCtrl.ui;    if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) {	FALLBACK( ctx, SAVAGE_FALLBACK_DRAW_BUFFER, GL_TRUE );        return;    }    switch ( ctx->DrawBuffer->_ColorDrawBufferIndexes[0] ) {    case BUFFER_FRONT_LEFT:        imesa->IsDouble = GL_FALSE;	imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->frontOffset>>11;	break;    case BUFFER_BACK_LEFT:        imesa->IsDouble = GL_TRUE;	imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->backOffset>>11;	break;    default:	FALLBACK( ctx, SAVAGE_FALLBACK_DRAW_BUFFER, GL_TRUE );	return;    }        imesa->NotFirstFrame = GL_FALSE;    savageXMesaSetClipRects(imesa);    FALLBACK(ctx, SAVAGE_FALLBACK_DRAW_BUFFER, GL_FALSE);    if (destCtrl != imesa->regs.s4.destCtrl.ui)        imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;}static void savageDDReadBuffer(GLcontext *ctx, GLenum mode ){   /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */}#if 0static void savageDDSetColor(GLcontext *ctx,                              GLubyte r, GLubyte g,                             GLubyte b, GLubyte a ){    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);    imesa->MonoColor = savagePackColor( imesa->savageScreen->frontFormat, r, g, b, a );}#endif/* ============================================================= * Window position and viewport transformation */void savageCalcViewport( GLcontext *ctx ){   savageContextPtr imesa = SAVAGE_CONTEXT(ctx);   const GLfloat *v = ctx->Viewport._WindowMap.m;   GLfloat *m = imesa->hw_viewport;   m[MAT_SX] =   v[MAT_SX];   m[MAT_TX] =   v[MAT_TX] + imesa->drawX + SUBPIXEL_X;   m[MAT_SY] = - v[MAT_SY];   m[MAT_TY] = - v[MAT_TY] + imesa->driDrawable->h + imesa->drawY + SUBPIXEL_Y;   /* Depth range is reversed (far: 0, near: 1) so that float depth    * compensates for loss of accuracy of far coordinates. */   if (imesa->float_depth && imesa->savageScreen->zpp == 2) {       /* The Savage 16-bit floating point depth format can't encode	* numbers < 2^-16. Make sure all depth values stay greater	* than that. */       m[MAT_SZ] = - v[MAT_SZ] * imesa->depth_scale * (65535.0/65536.0);       m[MAT_TZ] = 1.0 - v[MAT_TZ] * imesa->depth_scale * (65535.0/65536.0);   } else {       m[MAT_SZ] = - v[MAT_SZ] * imesa->depth_scale;       m[MAT_TZ] = 1.0 - v[MAT_TZ] * imesa->depth_scale;   }   imesa->SetupNewInputs = ~0;}static void savageViewport( GLcontext *ctx, 			    GLint x, GLint y, 			    GLsizei width, GLsizei height ){   savageCalcViewport( ctx );}static void savageDepthRange( GLcontext *ctx, 			      GLclampd nearval, GLclampd farval ){   savageCalcViewport( ctx );}/* ============================================================= * Miscellaneous */static void savageDDClearColor(GLcontext *ctx, 			       const GLfloat color[4] ){    savageContextPtr imesa = SAVAGE_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]);    imesa->ClearColor = savagePackColor( imesa->savageScreen->frontFormat,					 c[0], c[1], c[2], c[3] );}/* Fallback to swrast for select and feedback. */static void savageRenderMode( GLcontext *ctx, GLenum mode ){   FALLBACK( ctx, SAVAGE_FALLBACK_RENDERMODE, (mode != GL_RENDER) );}#if HW_CULL/* ============================================================= * Culling - the savage isn't quite as clean here as the rest of *           its interfaces, but it's not bad. */static void savageDDCullFaceFrontFace(GLcontext *ctx, GLenum unused){    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);    GLuint cullMode=imesa->LcsCullMode;            switch (ctx->Polygon.CullFaceMode)    {        case GL_FRONT:            switch (ctx->Polygon.FrontFace)            {                case GL_CW:                    cullMode = BCM_CW;                    break;                case GL_CCW:                    cullMode = BCM_CCW;                    break;            }            break;        case GL_BACK:            switch (ctx->Polygon.FrontFace)            {                case GL_CW:                    cullMode = BCM_CCW;                    break;                case GL_CCW:                    cullMode = BCM_CW;                    break;            }            break;    }    imesa->LcsCullMode = cullMode;        imesa->new_state |= SAVAGE_NEW_CULL;}#endif /* end #if HW_CULL */static void savageUpdateCull( GLcontext *ctx ){#if HW_CULL    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);    GLuint cullMode;    if (ctx->Polygon.CullFlag &&	imesa->raster_primitive >= GL_TRIANGLES &&	ctx->Polygon.CullFaceMode != GL_FRONT_AND_BACK)	cullMode = imesa->LcsCullMode;    else	cullMode = BCM_None;    if (imesa->savageScreen->chipset >= S3_SAVAGE4) {	if (imesa->regs.s4.drawCtrl1.ni.cullMode != cullMode) {	    imesa->regs.s4.drawCtrl1.ni.cullMode = cullMode;	    imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;	}    } else {	if (imesa->regs.s3d.drawCtrl.ni.cullMode != cullMode) {	    imesa->regs.s3d.drawCtrl.ni.cullMode = cullMode;	    imesa->dirty |= SAVAGE_UPLOAD_LOCAL;	}    }#endif /* end  #if HW_CULL */}/* ============================================================= * Color masks *//* Savage4 can disable draw updates when all channels are * masked. Savage3D has a bit called drawUpdateEn, but it doesn't seem * to have any effect. If only some channels are masked we need a * software fallback on all chips. */static void savageDDColorMask_s4(GLcontext *ctx, 				 GLboolean r, GLboolean g, 				 GLboolean b, GLboolean a ){    savageContextPtr imesa = SAVAGE_CONTEXT( ctx );    GLboolean passAny, passAll;    if (ctx->Visual.alphaBits) {	passAny = b || g || r || a;	passAll = r && g && b && a;    } else {	passAny = b || g || r;	passAll = r && g && b;    }    if (passAny) {	if (!imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn) {	    imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn = GL_TRUE;	    imesa->dirty |= SAVAGE_UPLOAD_LOCAL;	}	FALLBACK (ctx, SAVAGE_FALLBACK_COLORMASK, !passAll);    } else if (imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn) {	imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn = GL_FALSE;	imesa->dirty |= SAVAGE_UPLOAD_LOCAL;    }}static void savageDDColorMask_s3d(GLcontext *ctx, 				  GLboolean r, GLboolean g, 				  GLboolean b, GLboolean a ){    if (ctx->Visual.alphaBits)	FALLBACK (ctx, SAVAGE_FALLBACK_COLORMASK, !(r && g && b && a));    else	FALLBACK (ctx, SAVAGE_FALLBACK_COLORMASK, !(r && g && b));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -