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

📄 via_state.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
	 }	 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 + -