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

📄 i830_metaops.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 2 页
字号:
   }   UNLOCK_HARDWARE(intel);   INTEL_FIREVERTICES(intel);   SET_STATE( i830, state );}#if 0GLbooleani830TryTextureReadPixels( GLcontext *ctx,			  GLint x, GLint y, GLsizei width, GLsizei height,			  GLenum format, GLenum type,			  const struct gl_pixelstore_attrib *pack,			  GLvoid *pixels ){   i830ContextPtr i830 = I830_CONTEXT(ctx);   intelContextPtr intel = INTEL_CONTEXT(ctx);   intelScreenPrivate *screen = i830->intel.intelScreen;   GLint pitch = pack->RowLength ? pack->RowLength : width;   __DRIdrawablePrivate *dPriv = i830->intel.driDrawable;   int textureFormat;   GLenum glTextureFormat;   int src_offset = i830->meta.Buffer[I830_DESTREG_CBUFADDR2];   int destOffset = intelAgpOffsetFromVirtual( &i830->intel, pixels);   int destFormat, depthFormat, destPitch;   drm_clip_rect_t tmp;   if (INTEL_DEBUG & DEBUG_PIXEL)      fprintf(stderr, "%s\n", __FUNCTION__);   if (	ctx->_ImageTransferState ||	pack->SwapBytes ||	pack->LsbFirst ||	!pack->Invert) {      fprintf(stderr, "%s: check_color failed\n", __FUNCTION__);      return GL_FALSE;   }   switch (screen->fbFormat) {   case DV_PF_565:      textureFormat = MAPSURF_16BIT | MT_16BIT_RGB565;      glTextureFormat = GL_RGB;      break;   case DV_PF_555:      textureFormat = MAPSURF_16BIT | MT_16BIT_ARGB1555;      glTextureFormat = GL_RGBA;      break;   case DV_PF_8888:      textureFormat = MAPSURF_32BIT | MT_32BIT_ARGB8888;      glTextureFormat = GL_RGBA;      break;   default:      fprintf(stderr, "%s: textureFormat failed %x\n", __FUNCTION__,	      screen->fbFormat);      return GL_FALSE;   }   switch (type) {   case GL_UNSIGNED_SHORT_5_6_5:       if (format != GL_RGB) return GL_FALSE;      destFormat = COLR_BUF_RGB565;       depthFormat = DEPTH_FRMT_16_FIXED;      destPitch = pitch * 2;      break;   case GL_UNSIGNED_INT_8_8_8_8_REV:       if (format != GL_BGRA) return GL_FALSE;      destFormat = COLR_BUF_ARGB8888;       depthFormat = DEPTH_FRMT_24_FIXED_8_OTHER;      destPitch = pitch * 4;      break;   default:      fprintf(stderr, "%s: destFormat failed %s\n", __FUNCTION__,	      _mesa_lookup_enum_by_nr(type));      return GL_FALSE;   }   destFormat |= (0x02<<24);/*    fprintf(stderr, "type: %s destFormat: %x\n", *//* 	   _mesa_lookup_enum_by_nr(type), *//* 	   destFormat); */   intelFlush( ctx );   SET_STATE( i830, meta );   set_initial_state( i830 );   set_no_depth_stencil_write( i830 );   LOCK_HARDWARE( intel );   {      intelWaitForIdle( intel ); /* required by GL */      if (!driClipRectToFramebuffer(ctx->ReadBuffer, &x, &y, &width, &height)) {	 UNLOCK_HARDWARE( intel );	 SET_STATE(i830, state);	 fprintf(stderr, "%s: cliprect failed\n", __FUNCTION__);	 return GL_TRUE;      }#if 0      /* FIXME -- Just emit the correct state       */      if (i830SetParam(i830->driFd, I830_SETPARAM_CBUFFER_PITCH, 		      destPitch) != 0) {	 UNLOCK_HARDWARE( intel );	 SET_STATE(i830, state);	 fprintf(stderr, "%s: setparam failed\n", __FUNCTION__);	 return GL_FALSE;      }#endif      y = dPriv->h - y - height;      x += dPriv->x;      y += dPriv->y;      /* Set the frontbuffer up as a large rectangular texture.       */      set_tex_rect_source( i830, 			   src_offset, 			   screen->width, 			   screen->height, 			   screen->front.pitch, 			   textureFormat );             enable_texture_blend_replace( i830 );       /* Set the 3d engine to draw into the agp memory       */      set_draw_region( i830, destOffset );       set_draw_format( i830, destFormat, depthFormat );        /* Draw a single quad, no cliprects:       */      i830->intel.numClipRects = 1;      i830->intel.pClipRects = &tmp;      i830->intel.pClipRects[0].x1 = 0;      i830->intel.pClipRects[0].y1 = 0;      i830->intel.pClipRects[0].x2 = width;      i830->intel.pClipRects[0].y2 = height;      draw_quad( i830, 		 0, width, 0, height, 		 0, 255, 0, 0, 		 x, x+width, y, y+height );      intelWindowMoved( intel );   }   UNLOCK_HARDWARE( intel );   intelFinish( ctx ); /* required by GL */   SET_STATE( i830, state );   return GL_TRUE;}GLbooleani830TryTextureDrawPixels( GLcontext *ctx,			  GLint x, GLint y, GLsizei width, GLsizei height,			  GLenum format, GLenum type,			  const struct gl_pixelstore_attrib *unpack,			  const GLvoid *pixels ){   intelContextPtr intel = INTEL_CONTEXT(ctx);   i830ContextPtr i830 = I830_CONTEXT(ctx);   GLint pitch = unpack->RowLength ? unpack->RowLength : width;   __DRIdrawablePrivate *dPriv = intel->driDrawable;   int textureFormat;   GLenum glTextureFormat;   int dst_offset = i830->meta.Buffer[I830_DESTREG_CBUFADDR2];   int src_offset = intelAgpOffsetFromVirtual( intel, pixels );   if (INTEL_DEBUG & DEBUG_PIXEL)      fprintf(stderr, "%s\n", __FUNCTION__);   /* Todo -- upload images that aren't in agp space, then texture    * from them.      */   if ( !intelIsAgpMemory( intel, pixels, pitch*height ) ) {      fprintf(stderr, "%s: intelIsAgpMemory failed\n", __FUNCTION__);      return GL_FALSE;   }   /* Todo -- don't want to clobber all the drawing state like we do    * for readpixels -- most of this state can be handled just fine.    */   if (	ctx->_ImageTransferState ||	unpack->SwapBytes ||	unpack->LsbFirst ||	ctx->Color.AlphaEnabled || 	ctx->Depth.Test ||	ctx->Fog.Enabled ||	ctx->Scissor.Enabled ||	ctx->Stencil.Enabled ||	!ctx->Color.ColorMask[0] ||	!ctx->Color.ColorMask[1] ||	!ctx->Color.ColorMask[2] ||	!ctx->Color.ColorMask[3] ||	ctx->Color.ColorLogicOpEnabled ||	ctx->Texture._EnabledUnits ||	ctx->Depth.OcclusionTest) {      fprintf(stderr, "%s: other tests failed\n", __FUNCTION__);      return GL_FALSE;   }   /* Todo -- remove these restrictions:    */   if (ctx->Pixel.ZoomX != 1.0F ||       ctx->Pixel.ZoomY != -1.0F)      return GL_FALSE;   switch (type) {   case GL_UNSIGNED_SHORT_1_5_5_5_REV:      if (format != GL_BGRA) return GL_FALSE;      textureFormat = MAPSURF_16BIT | MT_16BIT_ARGB1555;      glTextureFormat = GL_RGBA;      break;   case GL_UNSIGNED_SHORT_5_6_5:       if (format != GL_RGB) return GL_FALSE;      textureFormat = MAPSURF_16BIT | MT_16BIT_RGB565;      glTextureFormat = GL_RGB;      break;   case GL_UNSIGNED_SHORT_8_8_MESA:       if (format != GL_YCBCR_MESA) return GL_FALSE;      textureFormat = (MAPSURF_422 | MT_422_YCRCB_SWAPY /*  		       | TM0S1_COLORSPACE_CONVERSION */	 );      glTextureFormat = GL_YCBCR_MESA;      break;   case GL_UNSIGNED_SHORT_8_8_REV_MESA:       if (format != GL_YCBCR_MESA) return GL_FALSE;      textureFormat = (MAPSURF_422 | MT_422_YCRCB_NORMAL /* 		       | TM0S1_COLORSPACE_CONVERSION */	 );      glTextureFormat = GL_YCBCR_MESA;      break;   case GL_UNSIGNED_INT_8_8_8_8_REV:       if (format != GL_BGRA) return GL_FALSE;      textureFormat = MAPSURF_32BIT | MT_32BIT_ARGB8888;      glTextureFormat = GL_RGBA;      break;   default:      fprintf(stderr, "%s: destFormat failed\n", __FUNCTION__);      return GL_FALSE;   }   intelFlush( ctx );   SET_STATE( i830, meta );   LOCK_HARDWARE( intel );   {      intelWaitForIdle( intel ); /* required by GL */      y -= height;			/* cope with pixel zoom */      if (!driClipRectToFramebuffer(ctx->ReadBuffer, &x, &y, &width, &height)) {	 UNLOCK_HARDWARE( intel );	 SET_STATE(i830, state);	 fprintf(stderr, "%s: cliprect failed\n", __FUNCTION__);	 return GL_TRUE;      }      y = dPriv->h - y - height;      set_initial_state( i830 );      /* Set the pixel image up as a rectangular texture.       */      set_tex_rect_source( i830, 			   src_offset, 			   width, 			   height, 			   pitch, /* XXXX!!!! -- /2 sometimes */			   textureFormat );             enable_texture_blend_replace( i830 );          /* Draw to the current draw buffer:       */      set_draw_offset( i830, dst_offset );      /* Draw a quad, use regular cliprects       *//*       fprintf(stderr, "x: %d y: %d width %d height %d\n", x, y, width, height); */      draw_quad( i830, 		 x, x+width, y, y+height,		 0, 255, 0, 0, 		 0, width, 0, height );      intelWindowMoved( intel );   }   UNLOCK_HARDWARE( intel );   intelFinish( ctx ); /* required by GL */      SET_STATE(i830, state);   return GL_TRUE;}#endif/** * Copy the window contents named by dPriv to the rotated (or reflected) * color buffer. * srcBuf is BUFFER_BIT_FRONT_LEFT or BUFFER_BIT_BACK_LEFT to indicate the source. */voidi830RotateWindow(intelContextPtr intel, __DRIdrawablePrivate *dPriv,                 GLuint srcBuf){   i830ContextPtr i830 = I830_CONTEXT( intel );   intelScreenPrivate *screen = intel->intelScreen;   const GLuint cpp = screen->cpp;   drm_clip_rect_t fullRect;   GLuint textureFormat, srcOffset, srcPitch;   const drm_clip_rect_t *clipRects;   int numClipRects;   int i;   int xOrig, yOrig;   int origNumClipRects;   drm_clip_rect_t *origRects;   /*    * set up hardware state    */   intelFlush( &intel->ctx );   SET_STATE( i830, meta );    set_initial_state( i830 );    set_no_texture( i830 );    set_vertex_format( i830 );    set_no_depth_stencil_write( i830 );   set_color_mask( i830, GL_FALSE );   LOCK_HARDWARE(intel);   /* save current drawing origin and cliprects (restored at end) */   xOrig = intel->drawX;   yOrig = intel->drawY;   origNumClipRects = intel->numClipRects;   origRects = intel->pClipRects;   if (!intel->numClipRects)      goto done;   /*    * set drawing origin, cliprects for full-screen access to rotated screen    */   fullRect.x1 = 0;   fullRect.y1 = 0;   fullRect.x2 = screen->rotatedWidth;   fullRect.y2 = screen->rotatedHeight;   intel->drawX = 0;   intel->drawY = 0;   intel->numClipRects = 1;   intel->pClipRects = &fullRect;   set_draw_region( i830, &screen->rotated );   if (cpp == 4)      textureFormat = MAPSURF_32BIT | MT_32BIT_ARGB8888;   else      textureFormat = MAPSURF_16BIT | MT_16BIT_RGB565;   if (srcBuf == BUFFER_BIT_FRONT_LEFT) {      srcPitch = screen->front.pitch;   /* in bytes */      srcOffset = screen->front.offset; /* bytes */      clipRects = dPriv->pClipRects;      numClipRects = dPriv->numClipRects;   }   else {      srcPitch = screen->back.pitch;   /* in bytes */      srcOffset = screen->back.offset; /* bytes */      clipRects = dPriv->pBackClipRects;      numClipRects = dPriv->numBackClipRects;   }   /* set the whole screen up as a texture to avoid alignment issues */   set_tex_rect_source(i830,                       srcOffset,                       screen->width,                       screen->height,                       srcPitch,                       textureFormat);   enable_texture_blend_replace(i830);   /*    * loop over the source window's cliprects    */   for (i = 0; i < numClipRects; i++) {      int srcX0 = clipRects[i].x1;      int srcY0 = clipRects[i].y1;      int srcX1 = clipRects[i].x2;      int srcY1 = clipRects[i].y2;      GLfloat verts[4][2], tex[4][2];      int j;      /* build vertices for four corners of clip rect */      verts[0][0] = srcX0;  verts[0][1] = srcY0;      verts[1][0] = srcX1;  verts[1][1] = srcY0;      verts[2][0] = srcX1;  verts[2][1] = srcY1;      verts[3][0] = srcX0;  verts[3][1] = srcY1;      /* .. and texcoords */      tex[0][0] = srcX0;  tex[0][1] = srcY0;      tex[1][0] = srcX1;  tex[1][1] = srcY0;      tex[2][0] = srcX1;  tex[2][1] = srcY1;      tex[3][0] = srcX0;  tex[3][1] = srcY1;      /* transform coords to rotated screen coords */      for (j = 0; j < 4; j++) {         matrix23TransformCoordf(&screen->rotMatrix,                                 &verts[j][0], &verts[j][1]);      }      /* draw polygon to map source image to dest region */      draw_poly(i830, 255, 255, 255, 255, 4, verts, tex);   } /* cliprect loop */   assert(!intel->prim.flush);    intelFlushBatchLocked( intel, GL_FALSE, GL_FALSE, GL_FALSE ); done:   /* restore original drawing origin and cliprects */   intel->drawX = xOrig;   intel->drawY = yOrig;   intel->numClipRects = origNumClipRects;   intel->pClipRects = origRects;   UNLOCK_HARDWARE(intel);   SET_STATE( i830, state );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -