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

📄 intel_blit.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************** *  * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. * All Rights Reserved. *  * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: *  * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *  **************************************************************************/#include <stdio.h>#include <errno.h>#include "mtypes.h"#include "context.h"#include "enums.h"#include "intel_batchbuffer.h"#include "intel_blit.h"#include "intel_buffers.h"#include "intel_context.h"#include "intel_fbo.h"#include "intel_reg.h"#include "intel_regions.h"#define FILE_DEBUG_FLAG DEBUG_BLIT/** * Copy the back color buffer to the front color buffer.  * Used for SwapBuffers(). */voidintelCopyBuffer(const __DRIdrawablePrivate * dPriv,                const drm_clip_rect_t * rect){   struct intel_context *intel;   const intelScreenPrivate *intelScreen;   int ret;   DBG("%s\n", __FUNCTION__);   assert(dPriv);   intel = intelScreenContext(dPriv->driScreenPriv->private);   if (!intel)      return;   intelScreen = intel->intelScreen;   if (intel->last_swap_fence) {      dri_fence_wait(intel->last_swap_fence);      dri_fence_unreference(intel->last_swap_fence);      intel->last_swap_fence = NULL;   }   intel->last_swap_fence = intel->first_swap_fence;   intel->first_swap_fence = NULL;   /* The LOCK_HARDWARE is required for the cliprects.  Buffer offsets    * should work regardless.    */   LOCK_HARDWARE(intel);   if (dPriv && dPriv->numClipRects) {      struct intel_framebuffer *intel_fb = dPriv->driverPrivate;      struct intel_region *src, *dst;      int nbox = dPriv->numClipRects;      drm_clip_rect_t *pbox = dPriv->pClipRects;      int cpp;      int src_pitch, dst_pitch;      unsigned short src_x, src_y;      int BR13, CMD;      int i;      src = intel_get_rb_region(&intel_fb->Base, BUFFER_BACK_LEFT);      dst = intel_get_rb_region(&intel_fb->Base, BUFFER_FRONT_LEFT);      src_pitch = src->pitch * src->cpp;      dst_pitch = dst->pitch * dst->cpp;      cpp = src->cpp;      ASSERT(intel_fb);      ASSERT(intel_fb->Base.Name == 0);    /* Not a user-created FBO */      ASSERT(src);      ASSERT(dst);      ASSERT(src->cpp == dst->cpp);      if (cpp == 2) {	 BR13 = (0xCC << 16) | (1 << 24);	 CMD = XY_SRC_COPY_BLT_CMD;      }      else {	 BR13 = (0xCC << 16) | (1 << 24) | (1 << 25);	 CMD = XY_SRC_COPY_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;      }#ifndef I915      if (src->tiled) {	 CMD |= XY_SRC_TILED;	 src_pitch /= 4;      }      if (dst->tiled) {	 CMD |= XY_DST_TILED;	 dst_pitch /= 4;      }#endif      /* do space/cliprects check before going any further */      intel_batchbuffer_require_space(intel->batch, 8 * 4, REFERENCES_CLIPRECTS);   again:      ret = dri_bufmgr_check_aperture_space(dst->buffer);      ret |= dri_bufmgr_check_aperture_space(src->buffer);            if (ret) {	intel_batchbuffer_flush(intel->batch);	goto again;      }            for (i = 0; i < nbox; i++, pbox++) {	 drm_clip_rect_t box = *pbox;	 if (rect) {	    if (!intel_intersect_cliprects(&box, &box, rect))	       continue;	 }	 if (box.x1 >= box.x2 ||	     box.y1 >= box.y2)	    continue;	 assert(box.x1 < box.x2);	 assert(box.y1 < box.y2);	 src_x = box.x1 - dPriv->x + dPriv->backX;	 src_y = box.y1 - dPriv->y + dPriv->backY;	 BEGIN_BATCH(8, REFERENCES_CLIPRECTS);	 OUT_BATCH(CMD);	 OUT_BATCH(BR13 | dst_pitch);	 OUT_BATCH((box.y1 << 16) | box.x1);	 OUT_BATCH((box.y2 << 16) | box.x2);	 OUT_RELOC(dst->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, 0);	 OUT_BATCH((src_y << 16) | src_x);	 OUT_BATCH(src_pitch);	 OUT_RELOC(src->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ, 0);	 ADVANCE_BATCH();      }      if (intel->first_swap_fence)	 dri_fence_unreference(intel->first_swap_fence);      intel_batchbuffer_flush(intel->batch);      intel->first_swap_fence = intel->batch->last_fence;      if (intel->first_swap_fence)	 dri_fence_reference(intel->first_swap_fence);   }   UNLOCK_HARDWARE(intel);}voidintelEmitFillBlit(struct intel_context *intel,		  GLuint cpp,		  GLshort dst_pitch,		  dri_bo *dst_buffer,		  GLuint dst_offset,		  GLboolean dst_tiled,		  GLshort x, GLshort y,		  GLshort w, GLshort h,		  GLuint color){   GLuint BR13, CMD;   BATCH_LOCALS;   dst_pitch *= cpp;   switch (cpp) {   case 1:   case 2:   case 3:      BR13 = (0xF0 << 16) | (1 << 24);      CMD = XY_COLOR_BLT_CMD;      break;   case 4:      BR13 = (0xF0 << 16) | (1 << 24) | (1 << 25);      CMD = XY_COLOR_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;      break;   default:      return;   }#ifndef I915   if (dst_tiled) {      CMD |= XY_DST_TILED;      dst_pitch /= 4;   }#endif   DBG("%s dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n",       __FUNCTION__, dst_buffer, dst_pitch, dst_offset, x, y, w, h);   assert(w > 0);   assert(h > 0);   BEGIN_BATCH(6, NO_LOOP_CLIPRECTS);   OUT_BATCH(CMD);   OUT_BATCH(BR13 | dst_pitch);   OUT_BATCH((y << 16) | x);   OUT_BATCH(((y + h) << 16) | (x + w));   OUT_RELOC(dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, dst_offset);   OUT_BATCH(color);   ADVANCE_BATCH();}static GLuint translate_raster_op(GLenum logicop){   switch(logicop) {   case GL_CLEAR: return 0x00;   case GL_AND: return 0x88;   case GL_AND_REVERSE: return 0x44;   case GL_COPY: return 0xCC;   case GL_AND_INVERTED: return 0x22;   case GL_NOOP: return 0xAA;   case GL_XOR: return 0x66;   case GL_OR: return 0xEE;   case GL_NOR: return 0x11;   case GL_EQUIV: return 0x99;   case GL_INVERT: return 0x55;   case GL_OR_REVERSE: return 0xDD;   case GL_COPY_INVERTED: return 0x33;   case GL_OR_INVERTED: return 0xBB;   case GL_NAND: return 0x77;   case GL_SET: return 0xFF;   default: return 0;   }}/* Copy BitBlt */voidintelEmitCopyBlit(struct intel_context *intel,		  GLuint cpp,		  GLshort src_pitch,		  dri_bo *src_buffer,		  GLuint src_offset,		  GLboolean src_tiled,		  GLshort dst_pitch,		  dri_bo *dst_buffer,		  GLuint dst_offset,		  GLboolean dst_tiled,		  GLshort src_x, GLshort src_y,		  GLshort dst_x, GLshort dst_y,		  GLshort w, GLshort h,		  GLenum logic_op){   GLuint CMD, BR13;   int dst_y2 = dst_y + h;   int dst_x2 = dst_x + w;   int ret;   BATCH_LOCALS;   /* do space/cliprects check before going any further */   intel_batchbuffer_require_space(intel->batch, 8 * 4, NO_LOOP_CLIPRECTS); again:   ret = dri_bufmgr_check_aperture_space(dst_buffer);   ret |= dri_bufmgr_check_aperture_space(src_buffer);   if (ret) {     intel_batchbuffer_flush(intel->batch);     goto again;   }   DBG("%s src:buf(%p)/%d+%d %d,%d dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n",       __FUNCTION__,       src_buffer, src_pitch, src_offset, src_x, src_y,       dst_buffer, dst_pitch, dst_offset, dst_x, dst_y, w, h);   src_pitch *= cpp;   dst_pitch *= cpp;   BR13 = translate_raster_op(logic_op) << 16;   switch (cpp) {   case 1:   case 2:   case 3:      BR13 |= (1 << 24);      CMD = XY_SRC_COPY_BLT_CMD;      break;   case 4:      BR13 |= (1 << 24) | (1 << 25);      CMD = XY_SRC_COPY_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;      break;   default:      return;   }

⌨️ 快捷键说明

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