📄 savagestate.c
字号:
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 + -