📄 r128_state.c
字号:
rmesa->dirty |= R128_UPLOAD_CONTEXT; } if ( rmesa->setup.tex_cntl_c != t ) { rmesa->setup.tex_cntl_c = t; rmesa->dirty |= R128_UPLOAD_CONTEXT; }}static void r128DDDepthFunc( GLcontext *ctx, GLenum func ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); FLUSH_BATCH( rmesa ); rmesa->new_state |= R128_NEW_DEPTH;}static void r128DDDepthMask( GLcontext *ctx, GLboolean flag ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); FLUSH_BATCH( rmesa ); rmesa->new_state |= R128_NEW_DEPTH;}static void r128DDClearDepth( GLcontext *ctx, GLclampd d ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); switch ( rmesa->setup.z_sten_cntl_c & R128_Z_PIX_WIDTH_MASK ) { case R128_Z_PIX_WIDTH_16: rmesa->ClearDepth = d * 0x0000ffff; break; case R128_Z_PIX_WIDTH_24: rmesa->ClearDepth = d * 0x00ffffff; rmesa->ClearDepth |= ctx->Stencil.Clear << 24; break; case R128_Z_PIX_WIDTH_32: rmesa->ClearDepth = d * 0xffffffff; break; }}/* ============================================================= * Fog */static void r128UpdateFogAttrib( GLcontext *ctx ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); GLuint t = rmesa->setup.tex_cntl_c; GLubyte c[4]; GLuint col; if ( ctx->Fog.Enabled ) { t |= R128_FOG_ENABLE; } else { t &= ~R128_FOG_ENABLE; } c[0] = FLOAT_TO_UBYTE( ctx->Fog.Color[0] ); c[1] = FLOAT_TO_UBYTE( ctx->Fog.Color[1] ); c[2] = FLOAT_TO_UBYTE( ctx->Fog.Color[2] ); col = r128PackColor( 4, c[0], c[1], c[2], 0 ); if ( rmesa->setup.fog_color_c != col ) { rmesa->setup.fog_color_c = col; rmesa->dirty |= R128_UPLOAD_CONTEXT; } if ( rmesa->setup.tex_cntl_c != t ) { rmesa->setup.tex_cntl_c = t; rmesa->dirty |= R128_UPLOAD_CONTEXT; }}static void r128DDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); FLUSH_BATCH( rmesa ); rmesa->new_state |= R128_NEW_FOG;}/* ============================================================= * Clipping */static void r128UpdateClipping( GLcontext *ctx ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); if ( rmesa->driDrawable ) { __DRIdrawablePrivate *drawable = rmesa->driDrawable; int x1 = 0; int y1 = 0; int x2 = drawable->w - 1; int y2 = drawable->h - 1; if ( ctx->Scissor.Enabled ) { if ( ctx->Scissor.X > x1 ) { x1 = ctx->Scissor.X; } if ( drawable->h - ctx->Scissor.Y - ctx->Scissor.Height > y1 ) { y1 = drawable->h - ctx->Scissor.Y - ctx->Scissor.Height; } if ( ctx->Scissor.X + ctx->Scissor.Width - 1 < x2 ) { x2 = ctx->Scissor.X + ctx->Scissor.Width - 1; } if ( drawable->h - ctx->Scissor.Y - 1 < y2 ) { y2 = drawable->h - ctx->Scissor.Y - 1; } } x1 += drawable->x; y1 += drawable->y; x2 += drawable->x; y2 += drawable->y; /* Clamp values to screen to avoid wrapping problems */ if ( x1 < 0 ) x1 = 0; else if ( x1 >= rmesa->driScreen->fbWidth ) x1 = rmesa->driScreen->fbWidth - 1; if ( y1 < 0 ) y1 = 0; else if ( y1 >= rmesa->driScreen->fbHeight ) y1 = rmesa->driScreen->fbHeight - 1; if ( x2 < 0 ) x2 = 0; else if ( x2 >= rmesa->driScreen->fbWidth ) x2 = rmesa->driScreen->fbWidth - 1; if ( y2 < 0 ) y2 = 0; else if ( y2 >= rmesa->driScreen->fbHeight ) y2 = rmesa->driScreen->fbHeight - 1; rmesa->setup.sc_top_left_c = (((y1 & 0x3FFF) << 16) | (x1 & 0x3FFF)); rmesa->setup.sc_bottom_right_c = (((y2 & 0x3FFF) << 16) | (x2 & 0x3FFF)); rmesa->dirty |= R128_UPLOAD_CONTEXT; }}static void r128DDScissor( GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); FLUSH_BATCH( rmesa ); rmesa->new_state |= R128_NEW_CLIP;}/* ============================================================= * Culling */static void r128UpdateCull( GLcontext *ctx ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); GLuint f = rmesa->setup.pm4_vc_fpu_setup; f &= ~R128_FRONT_DIR_MASK; switch ( ctx->Polygon.FrontFace ) { case GL_CW: f |= R128_FRONT_DIR_CW; break; case GL_CCW: f |= R128_FRONT_DIR_CCW; break; } f |= R128_BACKFACE_SOLID | R128_FRONTFACE_SOLID; if ( ctx->Polygon.CullFlag ) { switch ( ctx->Polygon.CullFaceMode ) { case GL_FRONT: f &= ~R128_FRONTFACE_SOLID; break; case GL_BACK: f &= ~R128_BACKFACE_SOLID; break; case GL_FRONT_AND_BACK: f &= ~(R128_BACKFACE_SOLID | R128_FRONTFACE_SOLID); break; } } if ( 1 || rmesa->setup.pm4_vc_fpu_setup != f ) { rmesa->setup.pm4_vc_fpu_setup = f; rmesa->dirty |= R128_UPLOAD_CONTEXT | R128_UPLOAD_SETUP; }}static void r128DDCullFace( GLcontext *ctx, GLenum mode ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); FLUSH_BATCH( rmesa ); rmesa->new_state |= R128_NEW_CULL;}static void r128DDFrontFace( GLcontext *ctx, GLenum mode ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); FLUSH_BATCH( rmesa ); rmesa->new_state |= R128_NEW_CULL;}/* ============================================================= * Masks */static void r128UpdateMasks( GLcontext *ctx ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); GLuint mask = r128PackColor( rmesa->r128Screen->cpp, ctx->Color.ColorMask[RCOMP], ctx->Color.ColorMask[GCOMP], ctx->Color.ColorMask[BCOMP], ctx->Color.ColorMask[ACOMP] ); if ( rmesa->setup.plane_3d_mask_c != mask ) { rmesa->setup.plane_3d_mask_c = mask; rmesa->dirty |= R128_UPLOAD_CONTEXT | R128_UPLOAD_MASKS; }}static void r128DDColorMask( GLcontext *ctx, GLboolean r, GLboolean g, GLboolean b, GLboolean a ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); FLUSH_BATCH( rmesa ); rmesa->new_state |= R128_NEW_MASKS;}/* ============================================================= * 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 ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); GLuint t = rmesa->setup.tex_cntl_c; if ( NEED_SECONDARY_COLOR( ctx ) ) { if (ctx->Light.ShadeModel == GL_FLAT) { /* R128 can't do flat-shaded separate specular */ t &= ~R128_SPEC_LIGHT_ENABLE; FALLBACK( rmesa, R128_FALLBACK_SEP_SPECULAR, GL_TRUE ); } else { t |= R128_SPEC_LIGHT_ENABLE; FALLBACK( rmesa, R128_FALLBACK_SEP_SPECULAR, GL_FALSE ); } } else { t &= ~R128_SPEC_LIGHT_ENABLE; FALLBACK( rmesa, R128_FALLBACK_SEP_SPECULAR, GL_FALSE ); } if ( rmesa->setup.tex_cntl_c != t ) { rmesa->setup.tex_cntl_c = t; rmesa->dirty |= R128_UPLOAD_CONTEXT; rmesa->dirty |= R128_UPLOAD_SETUP; rmesa->new_state |= R128_NEW_CONTEXT; }}static void r128DDLightModelfv( GLcontext *ctx, GLenum pname, const GLfloat *param ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); if ( pname == GL_LIGHT_MODEL_COLOR_CONTROL ) { FLUSH_BATCH( rmesa ); updateSpecularLighting(ctx); }}static void r128DDShadeModel( GLcontext *ctx, GLenum mode ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); GLuint s = rmesa->setup.pm4_vc_fpu_setup; s &= ~R128_FPU_COLOR_MASK; switch ( mode ) { case GL_FLAT: s |= R128_FPU_COLOR_FLAT; break; case GL_SMOOTH: s |= R128_FPU_COLOR_GOURAUD; break; default: return; } updateSpecularLighting(ctx); if ( rmesa->setup.pm4_vc_fpu_setup != s ) { FLUSH_BATCH( rmesa ); rmesa->setup.pm4_vc_fpu_setup = s; rmesa->new_state |= R128_NEW_CONTEXT; rmesa->dirty |= R128_UPLOAD_SETUP; }}/* ============================================================= * Window position */static void r128UpdateWindow( GLcontext *ctx ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); int x = rmesa->driDrawable->x; int y = rmesa->driDrawable->y; struct gl_renderbuffer *rb = ctx->DrawBuffer->_ColorDrawBuffers[0]; driRenderbuffer *drb = (driRenderbuffer *) rb; rmesa->setup.window_xy_offset = (((y & 0xFFF) << R128_WINDOW_Y_SHIFT) | ((x & 0xFFF) << R128_WINDOW_X_SHIFT)); rmesa->setup.dst_pitch_offset_c = (((drb->flippedPitch/8) << 21) | (drb->flippedOffset >> 5)); rmesa->dirty |= R128_UPLOAD_CONTEXT | R128_UPLOAD_WINDOW;}/* ============================================================= * Viewport */static void r128CalcViewport( GLcontext *ctx ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); const GLfloat *v = ctx->Viewport._WindowMap.m; GLfloat *m = rmesa->hw_viewport; /* See also r128_translate_vertex. */ m[MAT_SX] = v[MAT_SX]; m[MAT_TX] = v[MAT_TX] + SUBPIXEL_X; m[MAT_SY] = - v[MAT_SY]; m[MAT_TY] = - v[MAT_TY] + rmesa->driDrawable->h + SUBPIXEL_Y; m[MAT_SZ] = v[MAT_SZ] * rmesa->depth_scale; m[MAT_TZ] = v[MAT_TZ] * rmesa->depth_scale;}static void r128Viewport( GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height ){ r128CalcViewport( ctx );}static void r128DepthRange( GLcontext *ctx, GLclampd nearval, GLclampd farval ){ r128CalcViewport( ctx );}/* ============================================================= * Miscellaneous */static void r128DDClearColor( GLcontext *ctx, const GLfloat color[4] ){ r128ContextPtr rmesa = R128_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]); rmesa->ClearColor = r128PackColor( rmesa->r128Screen->cpp, c[0], c[1], c[2], c[3] );}static void r128DDLogicOpCode( GLcontext *ctx, GLenum opcode ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); if ( ctx->Color.ColorLogicOpEnabled ) { FLUSH_BATCH( rmesa ); FALLBACK( rmesa, R128_FALLBACK_LOGICOP, opcode != GL_COPY ); }}static void r128DDDrawBuffer( GLcontext *ctx, GLenum mode ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); FLUSH_BATCH( rmesa ); if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) { /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */ FALLBACK( rmesa, R128_FALLBACK_DRAW_BUFFER, GL_TRUE ); return; } else { switch ( ctx->DrawBuffer->_ColorDrawBufferIndexes[0] ) { case BUFFER_FRONT_LEFT: case BUFFER_BACK_LEFT: FALLBACK( rmesa, R128_FALLBACK_DRAW_BUFFER, GL_FALSE ); break; default: /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */ FALLBACK( rmesa, R128_FALLBACK_DRAW_BUFFER, GL_TRUE ); break; } } rmesa->new_state |= R128_NEW_WINDOW;}static void r128DDReadBuffer( GLcontext *ctx, GLenum mode ){ /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */}/* ============================================================= * Polygon stipple */static void r128DDPolygonStipple( GLcontext *ctx, const GLubyte *mask ){ r128ContextPtr rmesa = R128_CONTEXT(ctx); GLuint stipple[32], i; drm_r128_stipple_t stippleRec; for (i = 0; i < 32; i++) { stipple[31 - i] = ((mask[i*4+0] << 24) | (mask[i*4+1] << 16) | (mask[i*4+2] << 8) | (mask[i*4+3])); } FLUSH_BATCH( rmesa ); LOCK_HARDWARE( rmesa ); stippleRec.mask = stipple; drmCommandWrite( rmesa->driFd, DRM_R128_STIPPLE, &stippleRec, sizeof(stippleRec) ); UNLOCK_HARDWARE( rmesa ); rmesa->new_state |= R128_NEW_CONTEXT; rmesa->dirty |= R128_UPLOAD_CONTEXT;}/* ============================================================= * Render mode */static void r128DDRenderMode( GLcontext *ctx, GLenum mode )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -