📄 gamma_state.c
字号:
break; case GL_DIFFUSE: CHECK_DMA_BUFFER(gmesa, 3); /* We don't do alpha */ WRITEF(gmesa->buf, Light0DiffuseIntensityBlue, params[2]); WRITEF(gmesa->buf, Light0DiffuseIntensityGreen, params[1]); WRITEF(gmesa->buf, Light0DiffuseIntensityRed, params[0]); break; case GL_SPECULAR: CHECK_DMA_BUFFER(gmesa, 3); /* We don't do alpha */ WRITEF(gmesa->buf, Light0SpecularIntensityBlue, params[2]); WRITEF(gmesa->buf, Light0SpecularIntensityGreen, params[1]); WRITEF(gmesa->buf, Light0SpecularIntensityRed, params[0]); break; case GL_POSITION: /* Normalize <x,y,z> */ x = params[0]; y = params[1]; z = params[2]; w = params[3]; l = sqrt(x*x + y*y + z*z + w*w); w /= l; x /= l; y /= l; z /= l; if (params[3] != 0.0) { gmesa->Light0Mode |= Light0ModeAttenuation; gmesa->Light0Mode |= Light0ModeLocal; } else { gmesa->Light0Mode &= ~Light0ModeAttenuation; gmesa->Light0Mode &= ~Light0ModeLocal; } CHECK_DMA_BUFFER(gmesa, 5); WRITE(gmesa->buf, Light0Mode, gmesa->Light0Mode); WRITEF(gmesa->buf, Light0PositionW, w); WRITEF(gmesa->buf, Light0PositionZ, z); WRITEF(gmesa->buf, Light0PositionY, y); WRITEF(gmesa->buf, Light0PositionX, x); break; case GL_SPOT_DIRECTION: CHECK_DMA_BUFFER(gmesa, 3); /* WRITEF(gmesa->buf, Light0SpotlightDirectionW, params[3]); */ WRITEF(gmesa->buf, Light0SpotlightDirectionZ, params[2]); WRITEF(gmesa->buf, Light0SpotlightDirectionY, params[1]); WRITEF(gmesa->buf, Light0SpotlightDirectionX, params[0]); break; case GL_SPOT_EXPONENT: CHECK_DMA_BUFFER(gmesa, 1); WRITEF(gmesa->buf, Light0SpotlightExponent, params[0]); break; case GL_SPOT_CUTOFF: if (params[0] != 180.0) gmesa->Light0Mode |= Light0ModeSpotLight; else gmesa->Light0Mode &= ~Light0ModeSpotLight; CHECK_DMA_BUFFER(gmesa, 2); WRITE(gmesa->buf, Light0Mode, gmesa->Light0Mode); WRITEF(gmesa->buf, Light0CosSpotlightCutoffAngle, cos(params[0]*DEG2RAD)); break; case GL_CONSTANT_ATTENUATION: CHECK_DMA_BUFFER(gmesa, 1); WRITEF(gmesa->buf, Light0ConstantAttenuation, params[0]); break; case GL_LINEAR_ATTENUATION: CHECK_DMA_BUFFER(gmesa, 1); WRITEF(gmesa->buf, Light0LinearAttenuation, params[0]); break; case GL_QUADRATIC_ATTENUATION: CHECK_DMA_BUFFER(gmesa, 1); WRITEF(gmesa->buf, Light0QuadraticAttenuation, params[0]); break; } break; }}static void gammaDDLightModelfv( GLcontext *ctx, GLenum pname, const GLfloat *params ){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); switch (pname) { case GL_LIGHT_MODEL_AMBIENT: CHECK_DMA_BUFFER(gmesa, 3); /* We don't do alpha */ WRITEF(gmesa->buf, SceneAmbientColorBlue, params[2]); WRITEF(gmesa->buf, SceneAmbientColorGreen, params[1]); WRITEF(gmesa->buf, SceneAmbientColorRed, params[0]); break; case GL_LIGHT_MODEL_LOCAL_VIEWER: if (params[0] != 0.0) gmesa->LightingMode |= LightingModeLocalViewer; else gmesa->LightingMode &= ~LightingModeLocalViewer; CHECK_DMA_BUFFER(gmesa, 1); WRITE(gmesa->buf, LightingMode, gmesa->LightingMode); break; case GL_LIGHT_MODEL_TWO_SIDE: if (params[0] == 1.0f) { gmesa->LightingMode |= LightingModeTwoSides; gmesa->MaterialMode |= MaterialModeTwoSides; } else { gmesa->LightingMode &= ~LightingModeTwoSides; gmesa->MaterialMode &= ~MaterialModeTwoSides; } CHECK_DMA_BUFFER(gmesa, 2); WRITE(gmesa->buf, LightingMode, gmesa->LightingMode); WRITE(gmesa->buf, MaterialMode, gmesa->MaterialMode); break; }}#endifstatic void gammaDDShadeModel( GLcontext *ctx, GLenum mode ){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); u_int32_t g = gmesa->GeometryMode; u_int32_t c = gmesa->ColorDDAMode; g &= ~GM_ShadingMask; c &= ~ColorDDAShadingMask; switch ( mode ) { case GL_FLAT: g |= GM_FlatShading; c |= ColorDDAFlat; break; case GL_SMOOTH: g |= GM_GouraudShading; c |= ColorDDAGouraud; break; default: return; } if ( gmesa->ColorDDAMode != c ) { FLUSH_BATCH( gmesa ); gmesa->ColorDDAMode = c; gmesa->dirty |= GAMMA_UPLOAD_SHADE; } if ( gmesa->GeometryMode != g ) { FLUSH_BATCH( gmesa ); gmesa->GeometryMode = g; gmesa->dirty |= GAMMA_UPLOAD_GEOMETRY; }}/* ============================================================= * Miscellaneous */static void gammaDDClearColor( GLcontext *ctx, const GLfloat color[4]){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); GLubyte c[4]; UNCLAMPED_FLOAT_TO_UBYTE(c[0], color[0]); UNCLAMPED_FLOAT_TO_UBYTE(c[1], color[1]); UNCLAMPED_FLOAT_TO_UBYTE(c[2], color[2]); UNCLAMPED_FLOAT_TO_UBYTE(c[3], color[3]); gmesa->ClearColor = gammaPackColor( gmesa->gammaScreen->cpp, c[0], c[1], c[2], c[3] ); if (gmesa->gammaScreen->cpp == 2) gmesa->ClearColor |= gmesa->ClearColor<<16;}static void gammaDDLogicalOpcode( GLcontext *ctx, GLenum opcode ){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); FLUSH_BATCH( gmesa ); if ( ctx->Color.ColorLogicOpEnabled ) { gmesa->LogicalOpMode = opcode << 1 | LogicalOpModeEnable; } else { gmesa->LogicalOpMode = LogicalOpModeDisable; } gmesa->dirty |= GAMMA_UPLOAD_LOGICOP;}static void gammaDDDrawBuffer( GLcontext *ctx, GLenum mode ){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); FLUSH_BATCH( gmesa ); switch ( mode ) { case GL_FRONT_LEFT: gmesa->drawOffset = gmesa->readOffset = 0; break; case GL_BACK_LEFT: gmesa->drawOffset = gmesa->readOffset = gmesa->driScreen->fbHeight * gmesa->driScreen->fbWidth * gmesa->gammaScreen->cpp; break; }}static void gammaDDReadBuffer( GLcontext *ctx, GLenum mode ){ /* XXX anything? */}/* ============================================================= * Window position and viewport transformation */void gammaUpdateWindow( GLcontext *ctx ){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); __DRIdrawablePrivate *dPriv = gmesa->driDrawable; GLfloat xoffset = (GLfloat)dPriv->x; GLfloat yoffset = gmesa->driScreen->fbHeight - (GLfloat)dPriv->y - dPriv->h; const GLfloat *v = ctx->Viewport._WindowMap.m; GLfloat sx = v[MAT_SX]; GLfloat tx = v[MAT_TX] + xoffset; GLfloat sy = v[MAT_SY]; GLfloat ty = v[MAT_TY] + yoffset; GLfloat sz = v[MAT_SZ] * gmesa->depth_scale; GLfloat tz = v[MAT_TZ] * gmesa->depth_scale; gmesa->dirty |= GAMMA_UPLOAD_VIEWPORT; gmesa->ViewportScaleX = sx; gmesa->ViewportScaleY = sy; gmesa->ViewportScaleZ = sz; gmesa->ViewportOffsetX = tx; gmesa->ViewportOffsetY = ty; gmesa->ViewportOffsetZ = tz;}static void gammaDDViewport( GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height ){ gammaUpdateWindow( ctx );}static void gammaDDDepthRange( GLcontext *ctx, GLclampd nearval, GLclampd farval ){ gammaUpdateWindow( ctx );}void gammaUpdateViewportOffset( GLcontext *ctx ){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); __DRIdrawablePrivate *dPriv = gmesa->driDrawable; GLfloat xoffset = (GLfloat)dPriv->x; GLfloat yoffset = gmesa->driScreen->fbHeight - (GLfloat)dPriv->y - dPriv->h; const GLfloat *v = ctx->Viewport._WindowMap.m; GLfloat tx = v[MAT_TX] + xoffset; GLfloat ty = v[MAT_TY] + yoffset; if ( gmesa->ViewportOffsetX != tx || gmesa->ViewportOffsetY != ty ) { gmesa->ViewportOffsetX = tx; gmesa->ViewportOffsetY = ty; gmesa->new_state |= GAMMA_NEW_WINDOW; } gmesa->new_state |= GAMMA_NEW_CLIP;}#if 0/* * Matrix */static void gammaLoadHWMatrix(GLcontext *ctx){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); const GLfloat *m; gmesa->TransformMode &= ~XM_XformTexture; switch (ctx->Transform.MatrixMode) { case GL_MODELVIEW: gmesa->TransformMode |= XM_UseModelViewMatrix; m = ctx->ModelviewMatrixStack.Top->m; CHECK_DMA_BUFFER(gmesa, 16); WRITEF(gmesa->buf, ModelViewMatrix0, m[0]); WRITEF(gmesa->buf, ModelViewMatrix1, m[1]); WRITEF(gmesa->buf, ModelViewMatrix2, m[2]); WRITEF(gmesa->buf, ModelViewMatrix3, m[3]); WRITEF(gmesa->buf, ModelViewMatrix4, m[4]); WRITEF(gmesa->buf, ModelViewMatrix5, m[5]); WRITEF(gmesa->buf, ModelViewMatrix6, m[6]); WRITEF(gmesa->buf, ModelViewMatrix7, m[7]); WRITEF(gmesa->buf, ModelViewMatrix8, m[8]); WRITEF(gmesa->buf, ModelViewMatrix9, m[9]); WRITEF(gmesa->buf, ModelViewMatrix10, m[10]); WRITEF(gmesa->buf, ModelViewMatrix11, m[11]); WRITEF(gmesa->buf, ModelViewMatrix12, m[12]); WRITEF(gmesa->buf, ModelViewMatrix13, m[13]); WRITEF(gmesa->buf, ModelViewMatrix14, m[14]); WRITEF(gmesa->buf, ModelViewMatrix15, m[15]); break; case GL_PROJECTION: m = ctx->ProjectionMatrixStack.Top->m; CHECK_DMA_BUFFER(gmesa, 16); WRITEF(gmesa->buf, ModelViewProjectionMatrix0, m[0]); WRITEF(gmesa->buf, ModelViewProjectionMatrix1, m[1]); WRITEF(gmesa->buf, ModelViewProjectionMatrix2, m[2]); WRITEF(gmesa->buf, ModelViewProjectionMatrix3, m[3]); WRITEF(gmesa->buf, ModelViewProjectionMatrix4, m[4]); WRITEF(gmesa->buf, ModelViewProjectionMatrix5, m[5]); WRITEF(gmesa->buf, ModelViewProjectionMatrix6, m[6]); WRITEF(gmesa->buf, ModelViewProjectionMatrix7, m[7]); WRITEF(gmesa->buf, ModelViewProjectionMatrix8, m[8]); WRITEF(gmesa->buf, ModelViewProjectionMatrix9, m[9]); WRITEF(gmesa->buf, ModelViewProjectionMatrix10, m[10]); WRITEF(gmesa->buf, ModelViewProjectionMatrix11, m[11]); WRITEF(gmesa->buf, ModelViewProjectionMatrix12, m[12]); WRITEF(gmesa->buf, ModelViewProjectionMatrix13, m[13]); WRITEF(gmesa->buf, ModelViewProjectionMatrix14, m[14]); WRITEF(gmesa->buf, ModelViewProjectionMatrix15, m[15]); break; case GL_TEXTURE: m = ctx->TextureMatrixStack[0].Top->m; CHECK_DMA_BUFFER(gmesa, 16); gmesa->TransformMode |= XM_XformTexture; WRITEF(gmesa->buf, TextureMatrix0, m[0]); WRITEF(gmesa->buf, TextureMatrix1, m[1]); WRITEF(gmesa->buf, TextureMatrix2, m[2]); WRITEF(gmesa->buf, TextureMatrix3, m[3]); WRITEF(gmesa->buf, TextureMatrix4, m[4]); WRITEF(gmesa->buf, TextureMatrix5, m[5]); WRITEF(gmesa->buf, TextureMatrix6, m[6]); WRITEF(gmesa->buf, TextureMatrix7, m[7]); WRITEF(gmesa->buf, TextureMatrix8, m[8]); WRITEF(gmesa->buf, TextureMatrix9, m[9]); WRITEF(gmesa->buf, TextureMatrix10, m[10]); WRITEF(gmesa->buf, TextureMatrix11, m[11]); WRITEF(gmesa->buf, TextureMatrix12, m[12]); WRITEF(gmesa->buf, TextureMatrix13, m[13]); WRITEF(gmesa->buf, TextureMatrix14, m[14]); WRITEF(gmesa->buf, TextureMatrix15, m[15]); break; default: /* ERROR!!! -- how did this happen? */ break; } gmesa->dirty |= GAMMA_UPLOAD_TRANSFORM;}#endif/* ============================================================= * State enable/disable */static void gammaDDEnable( GLcontext *ctx, GLenum cap, GLboolean state ){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); switch ( cap ) { case GL_ALPHA_TEST: case GL_BLEND: FLUSH_BATCH( gmesa ); gmesa->new_state |= GAMMA_NEW_ALPHA; break; case GL_CULL_FACE: FLUSH_BATCH( gmesa ); gmesa->new_state |= GAMMA_NEW_CULL; break; case GL_DEPTH_TEST: FLUSH_BATCH( gmesa ); gmesa->new_state |= GAMMA_NEW_DEPTH; break; case GL_DITHER: do { u_int32_t d = gmesa->DitherMode; FLUSH_BATCH( gmesa ); if ( state ) { d |= DM_DitherEnable; } else { d &= ~DM_DitherEnable; } if ( gmesa->DitherMode != d ) { gmesa->DitherMode = d; gmesa->dirty |= GAMMA_UPLOAD_DITHER; } } while (0); break;#if 0 case GL_FOG: FLUSH_BATCH( gmesa ); gmesa->new_state |= GAMMA_NEW_FOG; break;#endif case GL_INDEX_LOGIC_OP: case GL_COLOR_LOGIC_OP: FLUSH_BATCH( gmesa ); gmesa->new_state |= GAMMA_NEW_LOGICOP; break;#if ENABLELIGHTING case GL_LIGHTING: do { u_int32_t l = gmesa->LightingMode; FLUSH_BATCH( gmesa ); if ( state ) { l |= LightingModeEnable; } else { l &= ~LightingModeEnable; } if ( gmesa->LightingMode != l ) { gmesa->LightingMode = l; gmesa->dirty |= GAMMA_UPLOAD_LIGHT; } } while (0); break; case GL_COLOR_MATERIAL:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -