📄 mgastate.c
字号:
0x5a5a, 0xa0a0, 0x5050, 0x0a0a, 0x0505, 0x8020, 0x0401, 0x1040, 0x0208, 0x0802, 0x4010, 0x0104, 0x2080, 0x0000};/** * The MGA supports a subset of possible 4x4 stipples natively, GL * wants 32x32. Fortunately stipple is usually a repeating pattern. * * \param ctx GL rendering context to be affected * \param mask Pointer to the 32x32 stipple mask */static void mgaDDPolygonStipple( GLcontext *ctx, const GLubyte *mask ){ mgaContextPtr mmesa = MGA_CONTEXT(ctx); const GLubyte *m = mask; GLubyte p[4]; int i,j,k; int active = (ctx->Polygon.StippleFlag && mmesa->raster_primitive == GL_TRIANGLES); GLuint stipple; FLUSH_BATCH(mmesa); mmesa->haveHwStipple = 0; if (active) { mmesa->dirty |= MGA_UPLOAD_CONTEXT; mmesa->setup.dwgctl &= ~(0xf<<20); } p[0] = mask[0] & 0xf; p[0] |= p[0] << 4; p[1] = mask[4] & 0xf; p[1] |= p[1] << 4; p[2] = mask[8] & 0xf; p[2] |= p[2] << 4; p[3] = mask[12] & 0xf; p[3] |= p[3] << 4; for (k = 0 ; k < 8 ; k++) for (j = 0 ; j < 4; j++) for (i = 0 ; i < 4 ; i++) if (*m++ != p[j]) { return; } stipple = ( ((p[0] & 0xf) << 0) | ((p[1] & 0xf) << 4) | ((p[2] & 0xf) << 8) | ((p[3] & 0xf) << 12) ); for (i = 0 ; i < 16 ; i++) if (mgaStipples[i] == stipple) { mmesa->poly_stipple = i<<20; mmesa->haveHwStipple = 1; break; } if (active) { mmesa->setup.dwgctl &= ~(0xf<<20); mmesa->setup.dwgctl |= mmesa->poly_stipple; }}/* ============================================================= * Rendering attributes * * We really don't want to recalculate all this every time we bind a * texture. These things shouldn't change all that often, so it makes * sense to break them out of the core texture state update routines. */static void updateSpecularLighting( GLcontext *ctx ){ mgaContextPtr mmesa = MGA_CONTEXT(ctx); unsigned int specen; specen = NEED_SECONDARY_COLOR(ctx) ? TMC_specen_enable : 0; if ( specen != mmesa->hw.specen ) { mmesa->hw.specen = specen; mmesa->dirty |= MGA_UPLOAD_TEX0 | MGA_UPLOAD_TEX1; }}/* ============================================================= * Materials */static void mgaDDLightModelfv(GLcontext *ctx, GLenum pname, const GLfloat *param){ if (pname == GL_LIGHT_MODEL_COLOR_CONTROL) { FLUSH_BATCH( MGA_CONTEXT(ctx) ); updateSpecularLighting( ctx ); }}/* ============================================================= * Stencil */static voidmgaDDStencilFuncSeparate(GLcontext *ctx, GLenum face, GLenum func, GLint ref, GLuint mask){ mgaContextPtr mmesa = MGA_CONTEXT(ctx); GLuint stencil; GLuint stencilctl; stencil = MGA_FIELD( S_sref, ref ) | MGA_FIELD( S_smsk, mask ); switch (func) { case GL_NEVER: stencilctl = SC_smode_snever; break; case GL_LESS: stencilctl = SC_smode_slt; break; case GL_LEQUAL: stencilctl = SC_smode_slte; break; case GL_GREATER: stencilctl = SC_smode_sgt; break; case GL_GEQUAL: stencilctl = SC_smode_sgte; break; case GL_NOTEQUAL: stencilctl = SC_smode_sne; break; case GL_EQUAL: stencilctl = SC_smode_se; break; case GL_ALWAYS: default: stencilctl = SC_smode_salways; break; } MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); mmesa->hw.stencil &= (S_sref_MASK & S_smsk_MASK); mmesa->hw.stencil |= stencil; mmesa->hw.stencilctl &= SC_smode_MASK; mmesa->hw.stencilctl |= stencilctl;}static voidmgaDDStencilMaskSeparate(GLcontext *ctx, GLenum face, GLuint mask){ mgaContextPtr mmesa = MGA_CONTEXT(ctx); MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); mmesa->hw.stencil &= S_swtmsk_MASK; mmesa->hw.stencil |= MGA_FIELD( S_swtmsk, mask );}static voidmgaDDStencilOpSeparate(GLcontext *ctx, GLenum face, GLenum fail, GLenum zfail, GLenum zpass){ mgaContextPtr mmesa = MGA_CONTEXT(ctx); GLuint stencilctl; stencilctl = 0; switch (ctx->Stencil.FailFunc[0]) { case GL_KEEP: stencilctl |= SC_sfailop_keep; break; case GL_ZERO: stencilctl |= SC_sfailop_zero; break; case GL_REPLACE: stencilctl |= SC_sfailop_replace; break; case GL_INCR: stencilctl |= SC_sfailop_incrsat; break; case GL_DECR: stencilctl |= SC_sfailop_decrsat; break; case GL_INCR_WRAP: stencilctl |= SC_sfailop_incr; break; case GL_DECR_WRAP: stencilctl |= SC_sfailop_decr; break; case GL_INVERT: stencilctl |= SC_sfailop_invert; break; default: break; } switch (ctx->Stencil.ZFailFunc[0]) { case GL_KEEP: stencilctl |= SC_szfailop_keep; break; case GL_ZERO: stencilctl |= SC_szfailop_zero; break; case GL_REPLACE: stencilctl |= SC_szfailop_replace; break; case GL_INCR: stencilctl |= SC_szfailop_incrsat; break; case GL_DECR: stencilctl |= SC_szfailop_decrsat; break; case GL_INCR_WRAP: stencilctl |= SC_szfailop_incr; break; case GL_DECR_WRAP: stencilctl |= SC_szfailop_decr; break; case GL_INVERT: stencilctl |= SC_szfailop_invert; break; default: break; } switch (ctx->Stencil.ZPassFunc[0]) { case GL_KEEP: stencilctl |= SC_szpassop_keep; break; case GL_ZERO: stencilctl |= SC_szpassop_zero; break; case GL_REPLACE: stencilctl |= SC_szpassop_replace; break; case GL_INCR: stencilctl |= SC_szpassop_incrsat; break; case GL_DECR: stencilctl |= SC_szpassop_decrsat; break; case GL_INCR_WRAP: stencilctl |= SC_szpassop_incr; break; case GL_DECR_WRAP: stencilctl |= SC_szpassop_decr; break; case GL_INVERT: stencilctl |= SC_szpassop_invert; break; default: break; } MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); mmesa->hw.stencilctl &= (SC_sfailop_MASK & SC_szfailop_MASK & SC_szpassop_MASK); mmesa->hw.stencilctl |= stencilctl;}/* ============================================================= * Window position and viewport transformation */void mgaCalcViewport( GLcontext *ctx ){ mgaContextPtr mmesa = MGA_CONTEXT(ctx); const GLfloat *v = ctx->Viewport._WindowMap.m; GLfloat *m = mmesa->hw_viewport; /* See also mga_translate_vertex. */ m[MAT_SX] = v[MAT_SX]; m[MAT_TX] = v[MAT_TX] + mmesa->drawX + SUBPIXEL_X; m[MAT_SY] = - v[MAT_SY]; m[MAT_TY] = - v[MAT_TY] + mmesa->driDrawable->h + mmesa->drawY + SUBPIXEL_Y; m[MAT_SZ] = v[MAT_SZ] * mmesa->depth_scale; m[MAT_TZ] = v[MAT_TZ] * mmesa->depth_scale; mmesa->SetupNewInputs = ~0;}static void mgaViewport( GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height ){ mgaCalcViewport( ctx );}static void mgaDepthRange( GLcontext *ctx, GLclampd nearval, GLclampd farval ){ mgaCalcViewport( ctx );}/* ============================================================= * Miscellaneous */static void mgaDDClearColor(GLcontext *ctx, const GLfloat color[4] ){ mgaContextPtr mmesa = MGA_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]); mmesa->ClearColor = mgaPackColor( mmesa->mgaScreen->cpp, c[0], c[1], c[2], c[3]);}/* Fallback to swrast for select and feedback. */static void mgaRenderMode( GLcontext *ctx, GLenum mode ){ FALLBACK( ctx, MGA_FALLBACK_RENDERMODE, (mode != GL_RENDER) );}static void mgaDDLogicOp( GLcontext *ctx, GLenum opcode ){ mgaContextPtr mmesa = MGA_CONTEXT( ctx ); MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); mmesa->hw.rop = mgarop_NoBLK[ opcode & 0x0f ];}static void mga_set_cliprects(mgaContextPtr mmesa){ __DRIdrawablePrivate *driDrawable = mmesa->driDrawable; if ((mmesa->draw_buffer != MGA_FRONT) || (driDrawable->numBackClipRects == 0)) { if (driDrawable->numClipRects == 0) { static drm_clip_rect_t zeroareacliprect = {0,0,0,0}; mmesa->numClipRects = 1; mmesa->pClipRects = &zeroareacliprect; } else { mmesa->numClipRects = driDrawable->numClipRects; mmesa->pClipRects = driDrawable->pClipRects; } mmesa->drawX = driDrawable->x; mmesa->drawY = driDrawable->y; } else { mmesa->numClipRects = driDrawable->numBackClipRects; mmesa->pClipRects = driDrawable->pBackClipRects; mmesa->drawX = driDrawable->backX; mmesa->drawY = driDrawable->backY; } mmesa->setup.dstorg = mmesa->drawOffset; mmesa->dirty |= MGA_UPLOAD_CONTEXT | MGA_UPLOAD_CLIPRECTS;}void mgaUpdateRects( mgaContextPtr mmesa, GLuint buffers ){ __DRIdrawablePrivate *const driDrawable = mmesa->driDrawable; __DRIdrawablePrivate *const driReadable = mmesa->driReadable; mmesa->dirty_cliprects = 0; driUpdateFramebufferSize(mmesa->glCtx, driDrawable); if (driDrawable != driReadable) { driUpdateFramebufferSize(mmesa->glCtx, driReadable); } mga_set_cliprects(mmesa); mgaUpdateClipping( mmesa->glCtx ); mgaCalcViewport( mmesa->glCtx );}static void mgaDDDrawBuffer(GLcontext *ctx, GLenum mode ){ mgaContextPtr mmesa = MGA_CONTEXT(ctx); FLUSH_BATCH( mmesa ); if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -