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

📄 r128_state.c

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