[Mesa-dev] [PATCH 44/51] i965: Pass the map-mode along to intel_mipmap_tree_map_raw()
Chris Wilson
chris at chris-wilson.co.uk
Tue Jan 10 21:24:07 UTC 2017
Since we can distinguish when mapping between READ and WRITE, we can
pass along the map mode to avoid stalls and flushes where possible.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
---
src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 29 +++++++++++++++------------
1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
index 6ec98b4c2a..40d20cf8c2 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
@@ -48,7 +48,8 @@
#define FILE_DEBUG_FLAG DEBUG_MIPTREE
static void *intel_miptree_map_raw(struct brw_context *brw,
- struct intel_mipmap_tree *mt);
+ struct intel_mipmap_tree *mt,
+ GLbitfield mode);
static void intel_miptree_unmap_raw(struct intel_mipmap_tree *mt);
@@ -2492,7 +2493,9 @@ intel_update_r8stencil(struct brw_context *brw,
}
static void *
-intel_miptree_map_raw(struct brw_context *brw, struct intel_mipmap_tree *mt)
+intel_miptree_map_raw(struct brw_context *brw,
+ struct intel_mipmap_tree *mt,
+ GLbitfield mode)
{
/* CPU accesses to color buffers don't understand fast color clears, so
* resolve any pending fast color clears before we map.
@@ -2507,7 +2510,7 @@ intel_miptree_map_raw(struct brw_context *brw, struct intel_mipmap_tree *mt)
if (mt->tiling != I915_TILING_NONE)
brw_bo_map_gtt(brw, bo, "miptree");
else
- brw_bo_map(brw, bo, true, "miptree");
+ brw_bo_map(brw, bo, mode & GL_MAP_WRITE_BIT, "miptree");
return bo->virtual;
}
@@ -2540,7 +2543,7 @@ intel_miptree_map_gtt(struct brw_context *brw,
y /= bh;
x /= bw;
- base = intel_miptree_map_raw(brw, mt) + mt->offset;
+ base = intel_miptree_map_raw(brw, mt, map->mode) + mt->offset;
if (base == NULL)
map->ptr = NULL;
@@ -2603,7 +2606,7 @@ intel_miptree_map_blit(struct brw_context *brw,
}
}
- map->ptr = intel_miptree_map_raw(brw, map->linear_mt);
+ map->ptr = intel_miptree_map_raw(brw, map->linear_mt, map->mode);
DBG("%s: %d,%d %dx%d from mt %p (%s) %d,%d = %p/%d\n", __func__,
map->x, map->y, map->w, map->h,
@@ -2665,7 +2668,7 @@ intel_miptree_map_movntdqa(struct brw_context *brw,
image_x += map->x;
image_y += map->y;
- void *src = intel_miptree_map_raw(brw, mt);
+ void *src = intel_miptree_map_raw(brw, mt, map->mode);
if (!src)
return;
@@ -2734,7 +2737,7 @@ intel_miptree_map_s8(struct brw_context *brw,
*/
if (!(map->mode & GL_MAP_INVALIDATE_RANGE_BIT)) {
uint8_t *untiled_s8_map = map->ptr;
- uint8_t *tiled_s8_map = intel_miptree_map_raw(brw, mt);
+ uint8_t *tiled_s8_map = intel_miptree_map_raw(brw, mt, GL_MAP_READ_BIT);
unsigned int image_x, image_y;
intel_miptree_get_image_offset(mt, level, slice, &image_x, &image_y);
@@ -2771,7 +2774,7 @@ intel_miptree_unmap_s8(struct brw_context *brw,
if (map->mode & GL_MAP_WRITE_BIT) {
unsigned int image_x, image_y;
uint8_t *untiled_s8_map = map->ptr;
- uint8_t *tiled_s8_map = intel_miptree_map_raw(brw, mt);
+ uint8_t *tiled_s8_map = intel_miptree_map_raw(brw, mt, GL_MAP_WRITE_BIT);
intel_miptree_get_image_offset(mt, level, slice, &image_x, &image_y);
@@ -2826,7 +2829,7 @@ intel_miptree_unmap_etc(struct brw_context *brw,
image_x += map->x;
image_y += map->y;
- uint8_t *dst = intel_miptree_map_raw(brw, mt)
+ uint8_t *dst = intel_miptree_map_raw(brw, mt, GL_MAP_WRITE_BIT)
+ image_y * mt->pitch
+ image_x * mt->cpp;
@@ -2877,8 +2880,8 @@ intel_miptree_map_depthstencil(struct brw_context *brw,
*/
if (!(map->mode & GL_MAP_INVALIDATE_RANGE_BIT)) {
uint32_t *packed_map = map->ptr;
- uint8_t *s_map = intel_miptree_map_raw(brw, s_mt);
- uint32_t *z_map = intel_miptree_map_raw(brw, z_mt);
+ uint8_t *s_map = intel_miptree_map_raw(brw, s_mt, GL_MAP_READ_BIT);
+ uint32_t *z_map = intel_miptree_map_raw(brw, z_mt, GL_MAP_READ_BIT);
unsigned int s_image_x, s_image_y;
unsigned int z_image_x, z_image_y;
@@ -2938,8 +2941,8 @@ intel_miptree_unmap_depthstencil(struct brw_context *brw,
if (map->mode & GL_MAP_WRITE_BIT) {
uint32_t *packed_map = map->ptr;
- uint8_t *s_map = intel_miptree_map_raw(brw, s_mt);
- uint32_t *z_map = intel_miptree_map_raw(brw, z_mt);
+ uint8_t *s_map = intel_miptree_map_raw(brw, s_mt, GL_MAP_WRITE_BIT);
+ uint32_t *z_map = intel_miptree_map_raw(brw, z_mt, GL_MAP_WRITE_BIT);
unsigned int s_image_x, s_image_y;
unsigned int z_image_x, z_image_y;
--
2.11.0
More information about the mesa-dev
mailing list