summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <[email protected]>2018-04-30 10:25:46 -0700
committerKenneth Graunke <[email protected]>2018-04-30 14:06:23 -0700
commit682bdaa658d63993e32f95a4244568aeab85642a (patch)
treebd94ac522e4325698ad4d5a66cb8d5e89c51294c
parent5367295e1aaca56e77207bdfd7b0a578573796b6 (diff)
i965: Record mipmap resolver for unmapping
When mapping a region of the mipmap_tree, record which complementary method to use to unmap it afterwards. By doing so we can avoid duplicating the decision tree used when mapping and thereby eliminate trivial errors that can be introduced if the two if-chains become out of sync. Signed-off-by: Chris Wilson <[email protected]> Reviewed-by: Scott D Phillips <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/intel_mipmap_tree.c33
-rw-r--r--src/mesa/drivers/dri/i965/intel_mipmap_tree.h6
2 files changed, 22 insertions, 17 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
index c0fe3c6623d..b9a564552df 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
@@ -3066,7 +3066,10 @@ intel_miptree_unmap_raw(struct intel_mipmap_tree *mt)
}
static void
-intel_miptree_unmap_gtt(struct intel_mipmap_tree *mt)
+intel_miptree_unmap_gtt(struct brw_context *brw,
+ struct intel_mipmap_tree *mt,
+ struct intel_miptree_map *map,
+ unsigned int level, unsigned int slice)
{
intel_miptree_unmap_raw(mt);
}
@@ -3116,6 +3119,8 @@ intel_miptree_map_gtt(struct brw_context *brw,
map->x, map->y, map->w, map->h,
mt, _mesa_get_format_name(mt->format),
x, y, map->ptr, map->stride);
+
+ map->unmap = intel_miptree_unmap_gtt;
}
static void
@@ -3181,6 +3186,7 @@ intel_miptree_map_blit(struct brw_context *brw,
mt, _mesa_get_format_name(mt->format),
level, slice, map->ptr, map->stride);
+ map->unmap = intel_miptree_unmap_blit;
return;
fail:
@@ -3262,6 +3268,8 @@ intel_miptree_map_movntdqa(struct brw_context *brw,
}
intel_miptree_unmap_raw(mt);
+
+ map->unmap = intel_miptree_unmap_movntdqa;
}
#endif
@@ -3338,6 +3346,8 @@ intel_miptree_map_s8(struct brw_context *brw,
map->x, map->y, map->w, map->h,
mt, map->ptr, map->stride);
}
+
+ map->unmap = intel_miptree_unmap_s8;
}
static void
@@ -3390,6 +3400,7 @@ intel_miptree_map_etc(struct brw_context *brw,
map->buffer = malloc(_mesa_format_image_size(mt->etc_format,
map->w, map->h, 1));
map->ptr = map->buffer;
+ map->unmap = intel_miptree_unmap_etc;
}
/**
@@ -3531,6 +3542,8 @@ intel_miptree_map_depthstencil(struct brw_context *brw,
map->x, map->y, map->w, map->h,
mt, map->ptr, map->stride);
}
+
+ map->unmap = intel_miptree_unmap_depthstencil;
}
/**
@@ -3702,22 +3715,8 @@ intel_miptree_unmap(struct brw_context *brw,
DBG("%s: mt %p (%s) level %d slice %d\n", __func__,
mt, _mesa_get_format_name(mt->format), level, slice);
- if (mt->format == MESA_FORMAT_S_UINT8) {
- intel_miptree_unmap_s8(brw, mt, map, level, slice);
- } else if (mt->etc_format != MESA_FORMAT_NONE &&
- !(map->mode & BRW_MAP_DIRECT_BIT)) {
- intel_miptree_unmap_etc(brw, mt, map, level, slice);
- } else if (mt->stencil_mt && !(map->mode & BRW_MAP_DIRECT_BIT)) {
- intel_miptree_unmap_depthstencil(brw, mt, map, level, slice);
- } else if (map->linear_mt) {
- intel_miptree_unmap_blit(brw, mt, map, level, slice);
-#if defined(USE_SSE41)
- } else if (map->buffer && cpu_has_sse4_1) {
- intel_miptree_unmap_movntdqa(brw, mt, map, level, slice);
-#endif
- } else {
- intel_miptree_unmap_gtt(mt);
- }
+ if (map->unmap)
+ map->unmap(brw, mt, map, level, slice);
intel_miptree_release_map(mt, level, slice);
}
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
index e99ea44b809..8cea562dfa4 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
@@ -88,6 +88,12 @@ struct intel_miptree_map {
void *ptr;
/** Stride of the mapping. */
int stride;
+
+ void (*unmap)(struct brw_context *brw,
+ struct intel_mipmap_tree *mt,
+ struct intel_miptree_map *map,
+ unsigned int level,
+ unsigned int slice);
};
/**