What I would prefer to assert is that, for each region that is currently mapped, no batch is emitted that uses that region's bo. However, it's much easier to implement this big hammer.
CC: Eric Anholt <e...@anholt.net> Signed-off-by: Chad Versace <c...@chad-versace.us> --- src/mesa/drivers/dri/intel/intel_batchbuffer.c | 5 +++++ src/mesa/drivers/dri/intel/intel_context.h | 8 ++++++++ src/mesa/drivers/dri/intel/intel_regions.c | 9 +++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/mesa/drivers/dri/intel/intel_batchbuffer.c b/src/mesa/drivers/dri/intel/intel_batchbuffer.c index 37c13c9..2ce027c 100644 --- a/src/mesa/drivers/dri/intel/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.c @@ -148,6 +148,11 @@ void _intel_batchbuffer_flush(struct intel_context *intel, const char *file, int line) { + /* No batch should be emitted that uses a mapped region. To gurantee that, + * we assert that no region is mapped. + */ + assert(intel->num_mapped_regions == 0); + if (intel->batch.used == 0) return; diff --git a/src/mesa/drivers/dri/intel/intel_context.h b/src/mesa/drivers/dri/intel/intel_context.h index eb78c00..f3d0bcc 100644 --- a/src/mesa/drivers/dri/intel/intel_context.h +++ b/src/mesa/drivers/dri/intel/intel_context.h @@ -287,6 +287,14 @@ struct intel_context */ GLboolean is_front_buffer_reading; + /** + * Count of intel_regions that are mapped. + * + * This allows us to assert that no batch buffer is emitted if a + * region is mapped. + */ + int num_mapped_regions; + GLboolean use_texture_tiling; GLboolean use_early_z; diff --git a/src/mesa/drivers/dri/intel/intel_regions.c b/src/mesa/drivers/dri/intel/intel_regions.c index 7faf4ca..d46c470 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.c +++ b/src/mesa/drivers/dri/intel/intel_regions.c @@ -111,15 +111,17 @@ debug_backtrace(void) GLubyte * intel_region_map(struct intel_context *intel, struct intel_region *region) { - intel_flush(&intel->ctx); - _DBG("%s %p\n", __FUNCTION__, region); if (!region->map_refcount++) { + intel_flush(&intel->ctx); + if (region->tiling != I915_TILING_NONE) drm_intel_gem_bo_map_gtt(region->bo); else drm_intel_bo_map(region->bo, GL_TRUE); + region->map = region->bo->virtual; + ++intel->num_mapped_regions; } return region->map; @@ -134,7 +136,10 @@ intel_region_unmap(struct intel_context *intel, struct intel_region *region) drm_intel_gem_bo_unmap_gtt(region->bo); else drm_intel_bo_unmap(region->bo); + region->map = NULL; + --intel->num_mapped_regions; + assert(intel->num_mapped_regions >= 0); } } -- 1.7.6.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev