Re: [Mesa-dev] [PATCH 2/3] i965/miptree: Separate src and dst slice specifiers in slice copy

2017-06-09 Thread Jason Ekstrand

The existence of this software fallback makes me sad 😥.


On June 9, 2017 7:05:33 AM Topi Pohjolainen  wrote:


Signed-off-by: Topi Pohjolainen 
---
 src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 60 ---
 1 file changed, 35 insertions(+), 25 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c 
b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c

index f8fdde7..a4b2aeb 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
@@ -1205,26 +1205,25 @@ intel_miptree_get_tile_offsets(const struct 
intel_mipmap_tree *mt,


 static void
 intel_miptree_copy_slice_sw(struct brw_context *brw,
-struct intel_mipmap_tree *dst_mt,
 struct intel_mipmap_tree *src_mt,
-int level,
-int slice,
-int width,
-int height)
+unsigned src_level, unsigned src_layer,
+struct intel_mipmap_tree *dst_mt,
+unsigned dst_level, unsigned dst_layer,
+unsigned width, unsigned height)
 {
void *src, *dst;
ptrdiff_t src_stride, dst_stride;
int cpp = dst_mt->cpp;

intel_miptree_map(brw, src_mt,
- level, slice,
+ src_level, src_layer,
  0, 0,
  width, height,
  GL_MAP_READ_BIT | BRW_MAP_DIRECT_BIT,
  &src, &src_stride);

intel_miptree_map(brw, dst_mt,
- level, slice,
+ dst_level, dst_layer,
  0, 0,
  width, height,
  GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT |
@@ -1250,8 +1249,8 @@ intel_miptree_copy_slice_sw(struct brw_context *brw,
   }
}

-   intel_miptree_unmap(brw, dst_mt, level, slice);
-   intel_miptree_unmap(brw, src_mt, level, slice);
+   intel_miptree_unmap(brw, dst_mt, dst_level, dst_layer);
+   intel_miptree_unmap(brw, src_mt, src_level, src_layer);

/* Don't forget to copy the stencil data over, too.  We could have skipped
 * passing BRW_MAP_DIRECT_BIT, but that would have meant intel_miptree_map
@@ -1260,23 +1259,28 @@ intel_miptree_copy_slice_sw(struct brw_context *brw,
 */
if (dst_mt->stencil_mt) {
   assert(src_mt->stencil_mt);
-  intel_miptree_copy_slice_sw(brw, dst_mt->stencil_mt, src_mt->stencil_mt,
-  level, slice, width, height);
+  intel_miptree_copy_slice_sw(brw,
+  src_mt->stencil_mt, src_level, src_layer,
+  dst_mt->stencil_mt, dst_level, dst_layer,
+  width, height);
}
 }

 static void
 intel_miptree_copy_slice(struct brw_context *brw,
-struct intel_mipmap_tree *dst_mt,
-struct intel_mipmap_tree *src_mt,
-unsigned level, unsigned slice)
+ struct intel_mipmap_tree *src_mt,
+ unsigned src_level, unsigned src_layer,
+ struct intel_mipmap_tree *dst_mt,
+ unsigned dst_level, unsigned dst_layer)

 {
+   uint32_t width = minify(src_mt->physical_width0,
+   src_level - src_mt->first_level);
+   uint32_t height = minify(src_mt->physical_height0,
+src_level - src_mt->first_level);
mesa_format format = src_mt->format;
-   uint32_t width = minify(src_mt->physical_width0, level - 
src_mt->first_level);
-   uint32_t height = minify(src_mt->physical_height0, level - 
src_mt->first_level);


-   assert(slice < src_mt->level[level].depth);
+   assert(src_layer < src_mt->level[src_level].depth);
assert(src_mt->format == dst_mt->format);

if (dst_mt->compressed) {
@@ -1292,15 +1296,17 @@ intel_miptree_copy_slice(struct brw_context *brw,
 */
if (src_mt->stencil_mt) {
   intel_miptree_copy_slice_sw(brw,
-  dst_mt, src_mt,
-  level, slice,
+  src_mt, src_level, src_layer,
+  dst_mt, dst_level, dst_layer,
   width, height);
   return;
}

uint32_t dst_x, dst_y, src_x, src_y;
-   intel_miptree_get_image_offset(dst_mt, level, slice, &dst_x, &dst_y);
-   intel_miptree_get_image_offset(src_mt, level, slice, &src_x, &src_y);
+   intel_miptree_get_image_offset(dst_mt, dst_level, dst_layer,
+  &dst_x, &dst_y);
+   intel_miptree_get_image_offset(src_mt, src_level, src_layer,
+  &src_x, &src_y);

DBG("validate blit mt %s %p %d,%d/%d -> mt %s %p %d,%d/%d (%dx%d)\n",
_mesa_get_format_name(src_mt->fo

[Mesa-dev] [PATCH 2/3] i965/miptree: Separate src and dst slice specifiers in slice copy

2017-06-09 Thread Topi Pohjolainen
Signed-off-by: Topi Pohjolainen 
---
 src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 60 ---
 1 file changed, 35 insertions(+), 25 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c 
b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
index f8fdde7..a4b2aeb 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
@@ -1205,26 +1205,25 @@ intel_miptree_get_tile_offsets(const struct 
intel_mipmap_tree *mt,
 
 static void
 intel_miptree_copy_slice_sw(struct brw_context *brw,
-struct intel_mipmap_tree *dst_mt,
 struct intel_mipmap_tree *src_mt,
-int level,
-int slice,
-int width,
-int height)
+unsigned src_level, unsigned src_layer,
+struct intel_mipmap_tree *dst_mt,
+unsigned dst_level, unsigned dst_layer,
+unsigned width, unsigned height)
 {
void *src, *dst;
ptrdiff_t src_stride, dst_stride;
int cpp = dst_mt->cpp;
 
intel_miptree_map(brw, src_mt,
- level, slice,
+ src_level, src_layer,
  0, 0,
  width, height,
  GL_MAP_READ_BIT | BRW_MAP_DIRECT_BIT,
  &src, &src_stride);
 
intel_miptree_map(brw, dst_mt,
- level, slice,
+ dst_level, dst_layer,
  0, 0,
  width, height,
  GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT |
@@ -1250,8 +1249,8 @@ intel_miptree_copy_slice_sw(struct brw_context *brw,
   }
}
 
-   intel_miptree_unmap(brw, dst_mt, level, slice);
-   intel_miptree_unmap(brw, src_mt, level, slice);
+   intel_miptree_unmap(brw, dst_mt, dst_level, dst_layer);
+   intel_miptree_unmap(brw, src_mt, src_level, src_layer);
 
/* Don't forget to copy the stencil data over, too.  We could have skipped
 * passing BRW_MAP_DIRECT_BIT, but that would have meant intel_miptree_map
@@ -1260,23 +1259,28 @@ intel_miptree_copy_slice_sw(struct brw_context *brw,
 */
if (dst_mt->stencil_mt) {
   assert(src_mt->stencil_mt);
-  intel_miptree_copy_slice_sw(brw, dst_mt->stencil_mt, src_mt->stencil_mt,
-  level, slice, width, height);
+  intel_miptree_copy_slice_sw(brw,
+  src_mt->stencil_mt, src_level, src_layer,
+  dst_mt->stencil_mt, dst_level, dst_layer,
+  width, height);
}
 }
 
 static void
 intel_miptree_copy_slice(struct brw_context *brw,
-struct intel_mipmap_tree *dst_mt,
-struct intel_mipmap_tree *src_mt,
-unsigned level, unsigned slice)
+ struct intel_mipmap_tree *src_mt,
+ unsigned src_level, unsigned src_layer,
+ struct intel_mipmap_tree *dst_mt,
+ unsigned dst_level, unsigned dst_layer)
 
 {
+   uint32_t width = minify(src_mt->physical_width0,
+   src_level - src_mt->first_level);
+   uint32_t height = minify(src_mt->physical_height0,
+src_level - src_mt->first_level);
mesa_format format = src_mt->format;
-   uint32_t width = minify(src_mt->physical_width0, level - 
src_mt->first_level);
-   uint32_t height = minify(src_mt->physical_height0, level - 
src_mt->first_level);
 
-   assert(slice < src_mt->level[level].depth);
+   assert(src_layer < src_mt->level[src_level].depth);
assert(src_mt->format == dst_mt->format);
 
if (dst_mt->compressed) {
@@ -1292,15 +1296,17 @@ intel_miptree_copy_slice(struct brw_context *brw,
 */
if (src_mt->stencil_mt) {
   intel_miptree_copy_slice_sw(brw,
-  dst_mt, src_mt,
-  level, slice,
+  src_mt, src_level, src_layer,
+  dst_mt, dst_level, dst_layer,
   width, height);
   return;
}
 
uint32_t dst_x, dst_y, src_x, src_y;
-   intel_miptree_get_image_offset(dst_mt, level, slice, &dst_x, &dst_y);
-   intel_miptree_get_image_offset(src_mt, level, slice, &src_x, &src_y);
+   intel_miptree_get_image_offset(dst_mt, dst_level, dst_layer,
+  &dst_x, &dst_y);
+   intel_miptree_get_image_offset(src_mt, src_level, src_layer,
+  &src_x, &src_y);
 
DBG("validate blit mt %s %p %d,%d/%d -> mt %s %p %d,%d/%d (%dx%d)\n",
_mesa_get_format_name(src_mt->format),
@@ -1310,13 +1316,15 @@ intel_miptree_copy_slice(struct brw_context *brw,
width, height);