From: Chris Wilson Date: Sat, 2 Nov 2013 21:13:45 +0000 (+0000) Subject: sna: Eliminate the redundancy between is_mappable/can_map X-Git-Tag: 2.99.906~52 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=add663919eb6aca1f5bbb39549d56f481ea0f273;p=platform%2Fupstream%2Fxf86-video-intel.git sna: Eliminate the redundancy between is_mappable/can_map Signed-off-by: Chris Wilson --- diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c index dc20c02..9d9f627 100644 --- a/src/sna/gen3_render.c +++ b/src/sna/gen3_render.c @@ -2668,8 +2668,7 @@ gen3_render_reset(struct sna *sna) state->last_floats_per_vertex = 0; state->last_vertex_offset = 0; - if (sna->render.vbo != NULL && - !kgem_bo_is_mappable(&sna->kgem, sna->render.vbo)) { + if (sna->render.vbo && !kgem_bo_can_map(&sna->kgem, sna->render.vbo)) { DBG(("%s: discarding vbo as next access will stall: %d\n", __FUNCTION__, sna->render.vbo->presumed_offset)); discard_vbo(sna); diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c index 5d95991..b122408 100644 --- a/src/sna/gen4_render.c +++ b/src/sna/gen4_render.c @@ -2876,8 +2876,7 @@ static void gen4_render_reset(struct sna *sna) sna->render_state.gen4.drawrect_limit = -1; sna->render_state.gen4.surface_table = -1; - if (sna->render.vbo && - !kgem_bo_is_mappable(&sna->kgem, sna->render.vbo)) { + if (sna->render.vbo && !kgem_bo_can_map(&sna->kgem, sna->render.vbo)) { DBG(("%s: discarding unmappable vbo\n", __FUNCTION__)); discard_vbo(sna); } diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c index e20b0d0..59ce2be 100644 --- a/src/sna/gen5_render.c +++ b/src/sna/gen5_render.c @@ -3020,8 +3020,7 @@ static void gen5_render_reset(struct sna *sna) sna->render_state.gen5.drawrect_limit = -1; sna->render_state.gen5.surface_table = -1; - if (sna->render.vbo && - !kgem_bo_is_mappable(&sna->kgem, sna->render.vbo)) { + if (sna->render.vbo && !kgem_bo_can_map(&sna->kgem, sna->render.vbo)) { DBG(("%s: discarding unmappable vbo\n", __FUNCTION__)); discard_vbo(sna); } diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index 9797ef9..8c57000 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -3483,8 +3483,10 @@ static void gen6_render_reset(struct sna *sna) sna->render_state.gen6.drawrect_limit = -1; sna->render_state.gen6.surface_table = -1; - assert(sna->render.vbo == NULL || - kgem_bo_is_mappable(&sna->kgem, sna->render.vbo)); + if (sna->render.vbo && !kgem_bo_can_map(&sna->kgem, sna->render.vbo)) { + DBG(("%s: discarding unmappable vbo\n", __FUNCTION__)); + discard_vbo(sna); + } sna->render.vertex_offset = 0; sna->render.nvertex_reloc = 0; diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index 4093c02..82c785f 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -3734,8 +3734,7 @@ static void gen7_render_reset(struct sna *sna) sna->render_state.gen7.drawrect_limit = -1; sna->render_state.gen7.surface_table = -1; - if (sna->render.vbo && - !kgem_bo_is_mappable(&sna->kgem, sna->render.vbo)) { + if (sna->render.vbo && !kgem_bo_can_map(&sna->kgem, sna->render.vbo)) { DBG(("%s: discarding unmappable vbo\n", __FUNCTION__)); discard_vbo(sna); } diff --git a/src/sna/kgem.c b/src/sna/kgem.c index f5e3a1c..264a379 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -1736,7 +1736,7 @@ inline static void kgem_bo_move_to_inactive(struct kgem *kgem, assert(bo->flush == false); list_move(&bo->list, &kgem->inactive[bucket(bo)]); if (bo->map__gtt) { - if (!__kgem_bo_is_mappable(kgem, bo)) { + if (!kgem_bo_can_map(kgem, bo)) { munmap(MAP(bo->map__gtt), bytes(bo)); bo->map__gtt = NULL; } @@ -6044,7 +6044,7 @@ skip_llc: CREATE_EXACT | CREATE_INACTIVE | CREATE_GTT_MAP); if (old == NULL) { old = search_linear_cache(kgem, alloc, CREATE_INACTIVE); - if (old && !__kgem_bo_is_mappable(kgem, old)) { + if (old && !kgem_bo_can_map(kgem, old)) { _kgem_bo_destroy(kgem, old); old = NULL; } @@ -6052,7 +6052,7 @@ skip_llc: if (old) { DBG(("%s: reusing handle=%d for buffer\n", __FUNCTION__, old->handle)); - assert(__kgem_bo_is_mappable(kgem, old)); + assert(kgem_bo_can_map(kgem, old)); assert(!old->snoop); assert(old->rq == NULL); diff --git a/src/sna/kgem.h b/src/sna/kgem.h index b6d9156..9b522e8 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -522,79 +522,6 @@ static inline bool kgem_bo_can_blt(struct kgem *kgem, return kgem_bo_blt_pitch_is_ok(kgem, bo); } -static inline bool __kgem_bo_is_mappable(struct kgem *kgem, - struct kgem_bo *bo) -{ - if (bo->domain == DOMAIN_GTT) - return true; - - if (kgem->gen < 040 && bo->tiling && - bo->presumed_offset & (kgem_bo_fenced_size(kgem, bo) - 1)) - return false; - - if (kgem->gen == 021 && bo->tiling == I915_TILING_Y) - return false; - - if (!bo->tiling && (kgem->has_llc || bo->domain == DOMAIN_CPU)) - return true; - - if (!bo->presumed_offset) - return __kgem_bo_num_pages(bo) <= kgem->aperture_mappable / 4; - - return bo->presumed_offset / PAGE_SIZE + __kgem_bo_num_pages(bo) <= kgem->aperture_mappable; -} - -static inline bool kgem_bo_is_mappable(struct kgem *kgem, - struct kgem_bo *bo) -{ - DBG(("%s: domain=%d, offset: %d size: %d\n", - __FUNCTION__, bo->domain, bo->presumed_offset, kgem_bo_size(bo))); - assert(bo->refcnt); - return __kgem_bo_is_mappable(kgem, bo); -} - -static inline bool kgem_bo_mapped(struct kgem *kgem, struct kgem_bo *bo) -{ - DBG(("%s: map=%p:%p, tiling=%d, domain=%d\n", - __FUNCTION__, bo->map__gtt, bo->map__cpu, bo->tiling, bo->domain)); - assert(bo->refcnt); - - if (bo->tiling == I915_TILING_NONE && (bo->domain == DOMAIN_CPU || kgem->has_llc)) - return bo->map__cpu != NULL; - - return bo->map__gtt != NULL; -} - -static inline bool kgem_bo_can_map(struct kgem *kgem, struct kgem_bo *bo) -{ - if (kgem_bo_mapped(kgem, bo)) - return true; - - if (!bo->tiling && (kgem->has_llc || bo->domain == DOMAIN_CPU)) - return true; - - if (kgem->gen == 021 && bo->tiling == I915_TILING_Y) - return false; - - return __kgem_bo_num_pages(bo) <= kgem->aperture_mappable / 4; -} - -static inline bool kgem_bo_can_map__cpu(struct kgem *kgem, - struct kgem_bo *bo, - bool write) -{ - if (bo->purged || (bo->scanout && write)) - return false; - - if (kgem->has_llc) - return true; - - if (bo->domain != DOMAIN_CPU) - return false; - - return !write || bo->exec == NULL; -} - static inline bool kgem_bo_is_snoop(struct kgem_bo *bo) { assert(bo->refcnt); @@ -707,6 +634,53 @@ static inline void kgem_bo_mark_dirty(struct kgem_bo *bo) } while ((bo = bo->proxy)); } +static inline bool kgem_bo_mapped(struct kgem *kgem, struct kgem_bo *bo) +{ + DBG(("%s: map=%p:%p, tiling=%d, domain=%d\n", + __FUNCTION__, bo->map__gtt, bo->map__cpu, bo->tiling, bo->domain)); + + if (bo->tiling == I915_TILING_NONE && (bo->domain == DOMAIN_CPU || kgem->has_llc)) + return bo->map__cpu != NULL; + + return bo->map__gtt != NULL; +} + +static inline bool kgem_bo_can_map(struct kgem *kgem, struct kgem_bo *bo) +{ + DBG(("%s: map=%p:%p, tiling=%d, domain=%d, offset=%d\n", + __FUNCTION__, bo->map__gtt, bo->map__cpu, bo->tiling, bo->domain, bo->presumed_offset)); + + if (!bo->tiling && (kgem->has_llc || bo->domain == DOMAIN_CPU)) + return true; + + if (bo->map__gtt != NULL) + return true; + + if (kgem->gen == 021 && bo->tiling == I915_TILING_Y) + return false; + + if (!bo->presumed_offset) + return __kgem_bo_num_pages(bo) <= kgem->aperture_mappable / 4; + + return bo->presumed_offset / PAGE_SIZE + __kgem_bo_num_pages(bo) <= kgem->aperture_mappable; +} + +static inline bool kgem_bo_can_map__cpu(struct kgem *kgem, + struct kgem_bo *bo, + bool write) +{ + if (bo->purged || (bo->scanout && write)) + return false; + + if (kgem->has_llc) + return true; + + if (bo->domain != DOMAIN_CPU) + return false; + + return !write || bo->exec == NULL; +} + #define KGEM_BUFFER_WRITE 0x1 #define KGEM_BUFFER_INPLACE 0x2 #define KGEM_BUFFER_LAST 0x4 diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index d302848..fdf51ea 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -1522,48 +1522,50 @@ sna_pixmap_create_mappable_gpu(PixmapPtr pixmap, { struct sna *sna = to_sna_from_pixmap(pixmap); struct sna_pixmap *priv = sna_pixmap(pixmap); - unsigned create; if (wedged(sna)) - goto done; + goto out; if ((priv->create & KGEM_CAN_CREATE_GTT) == 0) - goto done; + goto out; assert_pixmap_damage(pixmap); if (can_replace && priv->gpu_bo && - (!kgem_bo_is_mappable(&sna->kgem, priv->gpu_bo) || + (!kgem_bo_can_map(&sna->kgem, priv->gpu_bo) || __kgem_bo_is_busy(&sna->kgem, priv->gpu_bo))) { if (priv->pinned) - goto done; + return false; DBG(("%s: discard busy GPU bo\n", __FUNCTION__)); sna_pixmap_free_gpu(sna, priv); } - if (priv->gpu_bo) - return kgem_bo_is_mappable(&sna->kgem, priv->gpu_bo); + if (priv->gpu_bo == NULL) { + unsigned create; - assert_pixmap_damage(pixmap); + assert_pixmap_damage(pixmap); + assert(priv->gpu_damage == NULL); - assert(priv->gpu_damage == NULL); - assert(priv->gpu_bo == NULL); + create = CREATE_GTT_MAP | CREATE_INACTIVE; + if (pixmap->usage_hint == SNA_CREATE_FB) + create |= CREATE_SCANOUT; - create = CREATE_GTT_MAP | CREATE_INACTIVE; - if (pixmap->usage_hint == SNA_CREATE_FB) - create |= CREATE_SCANOUT; + priv->gpu_bo = + kgem_create_2d(&sna->kgem, + pixmap->drawable.width, + pixmap->drawable.height, + pixmap->drawable.bitsPerPixel, + sna_pixmap_choose_tiling(pixmap, DEFAULT_TILING), + create); + } - priv->gpu_bo = - kgem_create_2d(&sna->kgem, - pixmap->drawable.width, - pixmap->drawable.height, - pixmap->drawable.bitsPerPixel, - sna_pixmap_choose_tiling(pixmap, DEFAULT_TILING), - create); +out: + if (priv->gpu_bo == NULL) + return false; -done: - return priv->gpu_bo && kgem_bo_is_mappable(&sna->kgem, priv->gpu_bo); + return (kgem_bo_can_map(&sna->kgem, priv->gpu_bo) && + !kgem_bo_is_busy(priv->gpu_bo)); } static inline bool use_cpu_bo_for_download(struct sna *sna, @@ -1587,7 +1589,7 @@ static inline bool use_cpu_bo_for_download(struct sna *sna, /* Is it worth detiling? */ assert(box[0].y1 < box[nbox-1].y2); - if (kgem_bo_is_mappable(&sna->kgem, priv->gpu_bo) && + if (kgem_bo_can_map(&sna->kgem, priv->gpu_bo) && (box[nbox-1].y2 - box[0].y1 - 1) * priv->gpu_bo->pitch < 4096) { DBG(("%s: no, tiny transfer (height=%d, pitch=%d) expect to read inplace\n", __FUNCTION__, box[nbox-1].y2-box[0].y1, priv->gpu_bo->pitch)); diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c index b5e4f37..db56f56 100644 --- a/src/sna/sna_io.c +++ b/src/sna/sna_io.c @@ -278,7 +278,7 @@ fallback: if (box[n].y2 > extents.y2) extents.y2 = box[n].y2; } - if (kgem_bo_is_mappable(kgem, src_bo)) { + if (kgem_bo_can_map(kgem, src_bo)) { /* Is it worth detiling? */ if ((extents.y2 - extents.y1 - 1) * src_bo->pitch < 4096) goto fallback; @@ -1787,7 +1787,7 @@ bool sna_replace(struct sna *sna, PixmapPtr pixmap, goto done; } - if (kgem_bo_is_mappable(&sna->kgem, bo) && + if (kgem_bo_can_map(&sna->kgem, bo) && (dst = kgem_bo_map(&sna->kgem, bo)) != NULL && sigtrap_get() == 0) { memcpy_blt(src, dst, pixmap->drawable.bitsPerPixel, @@ -1861,7 +1861,7 @@ sna_replace__xor(struct sna *sna, PixmapPtr pixmap, } } - if (kgem_bo_is_mappable(&sna->kgem, bo) && + if (kgem_bo_can_map(&sna->kgem, bo) && (dst = kgem_bo_map(&sna->kgem, bo)) != NULL && sigtrap_get() == 0) { memcpy_xor(src, dst, pixmap->drawable.bitsPerPixel,