diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-10-04 11:10:57 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-10-04 11:10:57 +0100 |
commit | 516d235c5b3bd51e9533925140d95d3b4533129c (patch) | |
tree | 4d05ca53e28afdc41aa1aa224b04fe9a496f837b /src/intel_uxa.c | |
parent | 455f2939a661764ebb8d1747d44e16a0a8937808 (diff) |
Split shadow handling routines to their own file.
This is about to get messy, so separate out the shadow from the normal
code.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/intel_uxa.c')
-rw-r--r-- | src/intel_uxa.c | 176 |
1 files changed, 0 insertions, 176 deletions
diff --git a/src/intel_uxa.c b/src/intel_uxa.c index ef4c553b..067994e7 100644 --- a/src/intel_uxa.c +++ b/src/intel_uxa.c @@ -918,182 +918,6 @@ static Bool intel_uxa_get_image(PixmapPtr pixmap, return ret; } -static dri_bo * -intel_shadow_create_bo(intel_screen_private *intel, - int16_t x1, int16_t y1, - int16_t x2, int16_t y2, - int *pitch) -{ - int w = x2 - x1, h = y2 - y1; - int size = h * w * intel->cpp; - dri_bo *bo; - - bo = drm_intel_bo_alloc(intel->bufmgr, "shadow", size, 0); - if (bo && drm_intel_gem_bo_map_gtt(bo) == 0) { - char *dst = bo->virtual; - char *src = intel->shadow_buffer; - int src_pitch = intel->shadow_stride; - int row_length = w * intel->cpp; - int num_rows = h; - src += y1 * src_pitch + x1 * intel->cpp; - do { - memcpy (dst, src, row_length); - src += src_pitch; - dst += row_length; - } while (--num_rows); - drm_intel_gem_bo_unmap_gtt(bo); - } - - *pitch = w * intel->cpp; - return bo; -} - -static void -intel_shadow_blt(intel_screen_private *intel) -{ - ScrnInfoPtr scrn = intel->scrn; - unsigned int dst_pitch; - uint32_t blt, br13; - RegionPtr region; - BoxPtr box; - int n; - - dst_pitch = intel->front_pitch; - - blt = XY_SRC_COPY_BLT_CMD; - if (intel->cpp == 4) - blt |= (XY_SRC_COPY_BLT_WRITE_ALPHA | - XY_SRC_COPY_BLT_WRITE_RGB); - - if (IS_I965G(intel)) { - if (intel->front_tiling) { - dst_pitch >>= 2; - blt |= XY_SRC_COPY_BLT_DST_TILED; - } - } - - br13 = ROP_S << 16 | dst_pitch; - switch (intel->cpp) { - default: - case 4: br13 |= 1 << 25; /* RGB8888 */ - case 2: br13 |= 1 << 24; /* RGB565 */ - case 1: break; - } - - region = DamageRegion(intel->shadow_damage); - box = REGION_RECTS(region); - n = REGION_NUM_RECTS(region); - while (n--) { - int pitch; - dri_bo *bo; - int offset; - - if (IS_I8XX(intel)) { - bo = intel->shadow_buffer; - offset = box->x1 | box->y1 << 16; - pitch = intel->shadow_stride; - } else { - bo = intel_shadow_create_bo(intel, - box->x1, box->y1, - box->x2, box->y2, - &pitch); - if (bo == NULL) - return; - - offset = 0; - } - - BEGIN_BATCH(8); - OUT_BATCH(blt); - OUT_BATCH(br13); - OUT_BATCH(box->y1 << 16 | box->x1); - OUT_BATCH(box->y2 << 16 | box->x2); - OUT_RELOC_FENCED(intel->front_buffer, - I915_GEM_DOMAIN_RENDER, - I915_GEM_DOMAIN_RENDER, - 0); - OUT_BATCH(offset); - OUT_BATCH(pitch); - OUT_RELOC(bo, I915_GEM_DOMAIN_RENDER, 0, 0); - - ADVANCE_BATCH(); - - if (bo != intel->shadow_buffer) - drm_intel_bo_unreference(bo); - box++; - } -} - -static void intel_shadow_create(struct intel_screen_private *intel) -{ - ScrnInfoPtr scrn = intel->scrn; - ScreenPtr screen = scrn->pScreen; - PixmapPtr pixmap; - int stride; - - pixmap = screen->GetScreenPixmap(screen); - if (IS_I8XX(intel)) { - dri_bo *bo; - int size; - - /* Reduce the incoherency worries for gen2 - * by only allocating a static shadow, at about 2-3x - * performance cost for forcing rendering to uncached memory. - */ - if (intel->shadow_buffer) { - drm_intel_gem_bo_unmap_gtt(intel->shadow_buffer); - drm_intel_bo_unreference(intel->shadow_buffer); - intel->shadow_buffer = NULL; - } - - stride = ALIGN(scrn->virtualX * intel->cpp, 4); - size = stride * scrn->virtualY; - bo = drm_intel_bo_alloc(intel->bufmgr, - "shadow", size, - 0); - if (bo && drm_intel_gem_bo_map_gtt(bo) == 0) { - screen->ModifyPixmapHeader(pixmap, - scrn->virtualX, - scrn->virtualY, - -1, -1, - stride, - bo->virtual); - intel->shadow_buffer = bo; - } - } else { - void *buffer; - - stride = intel->cpp*scrn->virtualX; - buffer = malloc(stride * scrn->virtualY); - - if (buffer && screen->ModifyPixmapHeader(pixmap, - scrn->virtualX, - scrn->virtualY, - -1, -1, - stride, - buffer)) { - if (intel->shadow_buffer) - free(intel->shadow_buffer); - - intel->shadow_buffer = buffer; - } else - stride = intel->shadow_stride; - } - - if (!intel->shadow_damage) { - intel->shadow_damage = DamageCreate(NULL, NULL, - DamageReportNone, - TRUE, - screen, - intel); - DamageRegister(&pixmap->drawable, intel->shadow_damage); - DamageSetReportAfterOp(intel->shadow_damage, TRUE); - } - - scrn->displayWidth = stride / intel->cpp; - intel->shadow_stride = stride; -} - void intel_uxa_block_handler(intel_screen_private *intel) { if (intel->shadow_damage && |