📄 via_state.c
字号:
} else if (numLevels > 1) { BEGIN_RING(12 + numLevels * 2); OUT_RING( HC_HEADER2 ); OUT_RING( (HC_ParaType_Tex << 16) | (texunit << 24) ); OUT_RING( t->regTexFM ); OUT_RING( (HC_SubA_HTXnL0OS << 24) | ((t->lastLevel) << HC_HTXnLVmax_SHIFT) | t->firstLevel ); OUT_RING( t->regTexWidthLog2[0] ); OUT_RING( t->regTexHeightLog2[0] ); if (numLevels > 6) { OUT_RING( t->regTexWidthLog2[1] ); OUT_RING( t->regTexHeightLog2[1] ); i += 2; } OUT_RING( t->regTexBaseH[0] ); if (numLevels > 3) { OUT_RING( t->regTexBaseH[1] ); } if (numLevels > 6) { OUT_RING( t->regTexBaseH[2] ); } if (numLevels > 9) { OUT_RING( t->regTexBaseH[3] ); } for (j = 0; j < numLevels; j++) { OUT_RING( t->regTexBaseAndPitch[j].baseL ); OUT_RING( t->regTexBaseAndPitch[j].pitchLog2 ); } ADVANCE_RING_VARIABLE(); } else { BEGIN_RING(9); OUT_RING( HC_HEADER2 ); OUT_RING( (HC_ParaType_Tex << 16) | (texunit << 24) ); OUT_RING( t->regTexFM ); OUT_RING( (HC_SubA_HTXnL0OS << 24) | ((t->lastLevel) << HC_HTXnLVmax_SHIFT) | t->firstLevel ); OUT_RING( t->regTexWidthLog2[0] ); OUT_RING( t->regTexHeightLog2[0] ); OUT_RING( t->regTexBaseH[0] ); OUT_RING( t->regTexBaseAndPitch[0].baseL ); OUT_RING( t->regTexBaseAndPitch[0].pitchLog2 ); ADVANCE_RING(); } BEGIN_RING(14); OUT_RING( (HC_SubA_HTXnTB << 24) | vmesa->regHTXnTB[1] ); OUT_RING( (HC_SubA_HTXnMPMD << 24) | vmesa->regHTXnMPMD[1] ); OUT_RING( (HC_SubA_HTXnTBLCsat << 24) | vmesa->regHTXnTBLCsat[1] ); OUT_RING( (HC_SubA_HTXnTBLCop << 24) | vmesa->regHTXnTBLCop[1] ); OUT_RING( (HC_SubA_HTXnTBLMPfog << 24) | vmesa->regHTXnTBLMPfog[1] ); OUT_RING( (HC_SubA_HTXnTBLAsat << 24) | vmesa->regHTXnTBLAsat[1] ); OUT_RING( (HC_SubA_HTXnTBLRCb << 24) | vmesa->regHTXnTBLRCb[1] ); OUT_RING( (HC_SubA_HTXnTBLRAa << 24) | vmesa->regHTXnTBLRAa[1] ); OUT_RING( (HC_SubA_HTXnTBLRFog << 24) | vmesa->regHTXnTBLRFog[1] ); OUT_RING( (HC_SubA_HTXnTBLRCa << 24) | vmesa->regHTXnTBLRCa[1] ); OUT_RING( (HC_SubA_HTXnTBLRCc << 24) | vmesa->regHTXnTBLRCc[1] ); OUT_RING( (HC_SubA_HTXnTBLRCbias << 24) | vmesa->regHTXnTBLRCbias[1] ); OUT_RING( (HC_SubA_HTXnTBC << 24) | vmesa->regHTXnTBC[1] ); OUT_RING( (HC_SubA_HTXnTRAH << 24) | vmesa->regHTXnTRAH[1] );/* OUT_RING( (HC_SubA_HTXnCLODu << 24) | vmesa->regHTXnCLOD[1] ); */ ADVANCE_RING(); /* KW: This test never succeeds: */ if (t->regTexFM == HC_HTXnFM_Index8) { const struct gl_color_table *table = &texObj->Palette; const GLfloat *tableF = table->TableF; BEGIN_RING(2 + table->Size); OUT_RING( HC_HEADER2 ); OUT_RING( (HC_ParaType_Palette << 16) | (texunit << 24) ); for (j = 0; j < table->Size; j++) { OUT_RING( tableF[j] ); } ADVANCE_RING(); } QWORD_PAD_RING(); } } #if 0 /* Polygon stipple is broken - for certain stipple values, * eg. 0xf0f0f0f0, the hardware will refuse to accept the stipple. * Coincidentally, conform generates just such a stipple. */ if (ctx->Polygon.StippleFlag) { GLuint *stipple = &ctx->PolygonStipple[0]; __DRIdrawablePrivate *dPriv = vmesa->driDrawable; struct via_renderbuffer *const vrb = (struct via_renderbuffer *) dPriv->driverPrivate; GLint i; BEGIN_RING(38); OUT_RING( HC_HEADER2 ); OUT_RING( ((HC_ParaType_Palette << 16) | (HC_SubType_Stipple << 24)) ); for (i = 31; i >= 0; i--) { GLint j; GLuint k = 0; /* Need to flip bits left to right: */ for (j = 0 ; j < 32; j++) if (stipple[i] & (1<<j)) k |= 1 << (31-j); OUT_RING( k ); } OUT_RING( HC_HEADER2 ); OUT_RING( (HC_ParaType_NotTex << 16) ); OUT_RING( (HC_SubA_HSPXYOS << 24) ); OUT_RING( (HC_SubA_HSPXYOS << 24) ); ADVANCE_RING(); }#endif vmesa->newEmitState = 0;}static INLINE GLuint viaPackColor(GLuint bpp, GLubyte r, GLubyte g, GLubyte b, GLubyte a){ switch (bpp) { case 16: return PACK_COLOR_565(r, g, b); case 32: return PACK_COLOR_8888(a, r, g, b); default: assert(0); return 0; }}static void viaBlendEquationSeparate(GLcontext *ctx, GLenum rgbMode, GLenum aMode){ if (VIA_DEBUG & DEBUG_STATE) fprintf(stderr, "%s in\n", __FUNCTION__); /* GL_EXT_blend_equation_separate not supported */ ASSERT(rgbMode == aMode); /* Can only do GL_ADD equation in hardware */ FALLBACK(VIA_CONTEXT(ctx), VIA_FALLBACK_BLEND_EQ, rgbMode != GL_FUNC_ADD_EXT); /* BlendEquation sets ColorLogicOpEnabled in an unexpected * manner. */ FALLBACK(VIA_CONTEXT(ctx), VIA_FALLBACK_LOGICOP, (ctx->Color.ColorLogicOpEnabled && ctx->Color.LogicOp != GL_COPY));}static void viaBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor){ struct via_context *vmesa = VIA_CONTEXT(ctx); GLboolean fallback = GL_FALSE; if (VIA_DEBUG & DEBUG_STATE) fprintf(stderr, "%s in\n", __FUNCTION__); switch (ctx->Color.BlendSrcRGB) { case GL_SRC_ALPHA_SATURATE: case GL_CONSTANT_COLOR: case GL_ONE_MINUS_CONSTANT_COLOR: case GL_CONSTANT_ALPHA: case GL_ONE_MINUS_CONSTANT_ALPHA: fallback = GL_TRUE; break; default: break; } switch (ctx->Color.BlendDstRGB) { case GL_CONSTANT_COLOR: case GL_ONE_MINUS_CONSTANT_COLOR: case GL_CONSTANT_ALPHA: case GL_ONE_MINUS_CONSTANT_ALPHA: fallback = GL_TRUE; break; default: break; } FALLBACK(vmesa, VIA_FALLBACK_BLEND_FUNC, fallback);}/* Shouldn't be called as the extension is disabled. */static void viaBlendFuncSeparate(GLcontext *ctx, GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorA, GLenum dfactorA){ if (dfactorRGB != dfactorA || sfactorRGB != sfactorA) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBlendEquation (disabled)"); } viaBlendFunc(ctx, sfactorRGB, dfactorRGB);}/* ============================================================= * Hardware clipping */static void viaScissor(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h){ struct via_context *vmesa = VIA_CONTEXT(ctx); if (!vmesa->driDrawable) return; if (VIA_DEBUG & DEBUG_STATE) fprintf(stderr, "%s %d,%d %dx%d, drawH %d\n", __FUNCTION__, x,y,w,h, vmesa->driDrawable->h); if (vmesa->scissor) { VIA_FLUSH_DMA(vmesa); /* don't pipeline cliprect changes */ } vmesa->scissorRect.x1 = x; vmesa->scissorRect.y1 = vmesa->driDrawable->h - y - h; vmesa->scissorRect.x2 = x + w; vmesa->scissorRect.y2 = vmesa->driDrawable->h - y;}static void viaEnable(GLcontext *ctx, GLenum cap, GLboolean state){ struct via_context *vmesa = VIA_CONTEXT(ctx); switch (cap) { case GL_SCISSOR_TEST: VIA_FLUSH_DMA(vmesa); vmesa->scissor = state; break; default: break; }}/* Fallback to swrast for select and feedback. */static void viaRenderMode(GLcontext *ctx, GLenum mode){ FALLBACK(VIA_CONTEXT(ctx), VIA_FALLBACK_RENDERMODE, (mode != GL_RENDER));}static void viaDrawBuffer(GLcontext *ctx, GLenum mode){ struct via_context *vmesa = VIA_CONTEXT(ctx); if (VIA_DEBUG & (DEBUG_DRI|DEBUG_STATE)) fprintf(stderr, "%s in\n", __FUNCTION__); if (!ctx->DrawBuffer) return; if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) { FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_TRUE); return; } switch ( ctx->DrawBuffer->_ColorDrawBufferIndexes[0] ) { case BUFFER_FRONT_LEFT: VIA_FLUSH_DMA(vmesa); vmesa->drawBuffer = &vmesa->front; FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_FALSE); break; case BUFFER_BACK_LEFT: VIA_FLUSH_DMA(vmesa); vmesa->drawBuffer = &vmesa->back; FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_FALSE); break; default: FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_TRUE); return; } viaXMesaWindowMoved(vmesa);}static void viaClearColor(GLcontext *ctx, const GLfloat color[4]){ struct via_context *vmesa = VIA_CONTEXT(ctx); GLubyte pcolor[4]; CLAMPED_FLOAT_TO_UBYTE(pcolor[0], color[0]); CLAMPED_FLOAT_TO_UBYTE(pcolor[1], color[1]); CLAMPED_FLOAT_TO_UBYTE(pcolor[2], color[2]); CLAMPED_FLOAT_TO_UBYTE(pcolor[3], color[3]); vmesa->ClearColor = viaPackColor(vmesa->viaScreen->bitsPerPixel, pcolor[0], pcolor[1], pcolor[2], pcolor[3]);}#define WRITEMASK_ALPHA_SHIFT 31#define WRITEMASK_RED_SHIFT 30#define WRITEMASK_GREEN_SHIFT 29#define WRITEMASK_BLUE_SHIFT 28static void viaColorMask(GLcontext *ctx, GLboolean r, GLboolean g, GLboolean b, GLboolean a){ struct via_context *vmesa = VIA_CONTEXT( ctx ); if (VIA_DEBUG & DEBUG_STATE) fprintf(stderr, "%s r(%d) g(%d) b(%d) a(%d)\n", __FUNCTION__, r, g, b, a); vmesa->ClearMask = (((!r) << WRITEMASK_RED_SHIFT) | ((!g) << WRITEMASK_GREEN_SHIFT) | ((!b) << WRITEMASK_BLUE_SHIFT) | ((!a) << WRITEMASK_ALPHA_SHIFT));}/* This hardware just isn't capable of private back buffers without * glitches and/or a hefty locking scheme. */void viaCalcViewport(GLcontext *ctx){ struct via_context *vmesa = VIA_CONTEXT(ctx); __DRIdrawablePrivate *dPriv = vmesa->driDrawable; struct via_renderbuffer *const vrb = (struct via_renderbuffer *) dPriv->driverPrivate; const GLfloat *v = ctx->Viewport._WindowMap.m; GLfloat *m = vmesa->ViewportMatrix.m; m[MAT_SX] = v[MAT_SX]; m[MAT_TX] = v[MAT_TX] + vrb->drawX + SUBPIXEL_X; m[MAT_SY] = - v[MAT_SY]; m[MAT_TY] = - v[MAT_TY] + vrb->drawY + SUBPIXEL_Y + vrb->drawH; m[MAT_SZ] = v[MAT_SZ] * (1.0 / vmesa->depth_max); m[MAT_TZ] = v[MAT_TZ] * (1.0 / vmesa->depth_max);}static void viaViewport(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height){ viaCalcViewport(ctx);}static void viaDepthRange(GLcontext *ctx, GLclampd nearval, GLclampd farval){ viaCalcViewport(ctx);}void viaInitState(GLcontext *ctx){ struct via_context *vmesa = VIA_CONTEXT(ctx); vmesa->regCmdB = HC_ACMD_HCmdB; vmesa->regEnable = HC_HenCW_MASK; /* Mesa should do this for us: */ ctx->Driver.BlendEquationSeparate( ctx, ctx->Color.BlendEquationRGB, ctx->Color.BlendEquationA); ctx->Driver.BlendFuncSeparate( ctx, ctx->Color.BlendSrcRGB, ctx->Color.BlendDstRGB,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -