|
 |
dddc06 |
From d9266ae66c9db12a9c2578a33bbd5ebd131b489f Mon Sep 17 00:00:00 2001
|
|
 |
dddc06 |
From: Kenneth Graunke <kenneth@whitecape.org>
|
|
 |
dddc06 |
Date: Mon, 28 Aug 2017 15:57:20 -0700
|
|
 |
dddc06 |
Subject: [PATCH 3/5] blorp: Turn anv_CmdCopyBuffer into a blorp_buffer_copy()
|
|
 |
dddc06 |
helper.
|
|
 |
dddc06 |
|
|
 |
dddc06 |
I want to be able to copy between buffer objects using BLORP in the i965
|
|
 |
dddc06 |
driver. Anvil already had code to do this, in a reasonably efficient
|
|
 |
dddc06 |
manner - first using large bpp copies, then smaller bpp copies.
|
|
 |
dddc06 |
|
|
 |
dddc06 |
This patch moves that logic into BLORP as blorp_buffer_copy(), so we
|
|
 |
dddc06 |
can use it in both drivers.
|
|
 |
dddc06 |
|
|
 |
dddc06 |
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
|
|
 |
dddc06 |
Signed-off-by: Lyude <lyude@redhat.com>
|
|
 |
dddc06 |
---
|
|
 |
dddc06 |
src/intel/blorp/blorp.h | 6 +++
|
|
 |
dddc06 |
src/intel/blorp/blorp_blit.c | 119 +++++++++++++++++++++++++++++++++++++++++++
|
|
 |
dddc06 |
src/intel/vulkan/anv_blorp.c | 117 +++++++-----------------------------------
|
|
 |
dddc06 |
3 files changed, 143 insertions(+), 99 deletions(-)
|
|
 |
dddc06 |
|
|
 |
dddc06 |
diff --git a/src/intel/blorp/blorp.h b/src/intel/blorp/blorp.h
|
|
 |
dddc06 |
index d19920e87f..e712b4fbb3 100644
|
|
 |
dddc06 |
--- a/src/intel/blorp/blorp.h
|
|
 |
dddc06 |
+++ b/src/intel/blorp/blorp.h
|
|
 |
dddc06 |
@@ -133,6 +133,12 @@ blorp_copy(struct blorp_batch *batch,
|
|
 |
dddc06 |
uint32_t dst_x, uint32_t dst_y,
|
|
 |
dddc06 |
uint32_t src_width, uint32_t src_height);
|
|
 |
dddc06 |
|
|
 |
dddc06 |
+void
|
|
 |
dddc06 |
+blorp_buffer_copy(struct blorp_batch *batch,
|
|
 |
dddc06 |
+ struct blorp_address src,
|
|
 |
dddc06 |
+ struct blorp_address dst,
|
|
 |
dddc06 |
+ uint64_t size);
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
void
|
|
 |
dddc06 |
blorp_fast_clear(struct blorp_batch *batch,
|
|
 |
dddc06 |
const struct blorp_surf *surf, enum isl_format format,
|
|
 |
dddc06 |
diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c
|
|
 |
dddc06 |
index 35008cbbb0..b012a0a0b3 100644
|
|
 |
dddc06 |
--- a/src/intel/blorp/blorp_blit.c
|
|
 |
dddc06 |
+++ b/src/intel/blorp/blorp_blit.c
|
|
 |
dddc06 |
@@ -2513,3 +2513,122 @@ blorp_copy(struct blorp_batch *batch,
|
|
 |
dddc06 |
|
|
 |
dddc06 |
do_blorp_blit(batch, ¶ms, &wm_prog_key, &coords);
|
|
 |
dddc06 |
}
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+static enum isl_format
|
|
 |
dddc06 |
+isl_format_for_size(unsigned size_B)
|
|
 |
dddc06 |
+{
|
|
 |
dddc06 |
+ switch (size_B) {
|
|
 |
dddc06 |
+ case 1: return ISL_FORMAT_R8_UINT;
|
|
 |
dddc06 |
+ case 2: return ISL_FORMAT_R8G8_UINT;
|
|
 |
dddc06 |
+ case 4: return ISL_FORMAT_R8G8B8A8_UINT;
|
|
 |
dddc06 |
+ case 8: return ISL_FORMAT_R16G16B16A16_UINT;
|
|
 |
dddc06 |
+ case 16: return ISL_FORMAT_R32G32B32A32_UINT;
|
|
 |
dddc06 |
+ default:
|
|
 |
dddc06 |
+ unreachable("Not a power-of-two format size");
|
|
 |
dddc06 |
+ }
|
|
 |
dddc06 |
+}
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+/**
|
|
 |
dddc06 |
+ * Returns the greatest common divisor of a and b that is a power of two.
|
|
 |
dddc06 |
+ */
|
|
 |
dddc06 |
+static uint64_t
|
|
 |
dddc06 |
+gcd_pow2_u64(uint64_t a, uint64_t b)
|
|
 |
dddc06 |
+{
|
|
 |
dddc06 |
+ assert(a > 0 || b > 0);
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+ unsigned a_log2 = ffsll(a) - 1;
|
|
 |
dddc06 |
+ unsigned b_log2 = ffsll(b) - 1;
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+ /* If either a or b is 0, then a_log2 or b_log2 till be UINT_MAX in which
|
|
 |
dddc06 |
+ * case, the MIN2() will take the other one. If both are 0 then we will
|
|
 |
dddc06 |
+ * hit the assert above.
|
|
 |
dddc06 |
+ */
|
|
 |
dddc06 |
+ return 1 << MIN2(a_log2, b_log2);
|
|
 |
dddc06 |
+}
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+static void
|
|
 |
dddc06 |
+do_buffer_copy(struct blorp_batch *batch,
|
|
 |
dddc06 |
+ struct blorp_address *src,
|
|
 |
dddc06 |
+ struct blorp_address *dst,
|
|
 |
dddc06 |
+ int width, int height, int block_size)
|
|
 |
dddc06 |
+{
|
|
 |
dddc06 |
+ /* The actual format we pick doesn't matter as blorp will throw it away.
|
|
 |
dddc06 |
+ * The only thing that actually matters is the size.
|
|
 |
dddc06 |
+ */
|
|
 |
dddc06 |
+ enum isl_format format = isl_format_for_size(block_size);
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+ UNUSED bool ok;
|
|
 |
dddc06 |
+ struct isl_surf surf;
|
|
 |
dddc06 |
+ ok = isl_surf_init(batch->blorp->isl_dev, &surf,
|
|
 |
dddc06 |
+ .dim = ISL_SURF_DIM_2D,
|
|
 |
dddc06 |
+ .format = format,
|
|
 |
dddc06 |
+ .width = width,
|
|
 |
dddc06 |
+ .height = height,
|
|
 |
dddc06 |
+ .depth = 1,
|
|
 |
dddc06 |
+ .levels = 1,
|
|
 |
dddc06 |
+ .array_len = 1,
|
|
 |
dddc06 |
+ .samples = 1,
|
|
 |
dddc06 |
+ .row_pitch = width * block_size,
|
|
 |
dddc06 |
+ .usage = ISL_SURF_USAGE_TEXTURE_BIT |
|
|
 |
dddc06 |
+ ISL_SURF_USAGE_RENDER_TARGET_BIT,
|
|
 |
dddc06 |
+ .tiling_flags = ISL_TILING_LINEAR_BIT);
|
|
 |
dddc06 |
+ assert(ok);
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+ struct blorp_surf src_blorp_surf = {
|
|
 |
dddc06 |
+ .surf = &surf,
|
|
 |
dddc06 |
+ .addr = *src,
|
|
 |
dddc06 |
+ };
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+ struct blorp_surf dst_blorp_surf = {
|
|
 |
dddc06 |
+ .surf = &surf,
|
|
 |
dddc06 |
+ .addr = *dst,
|
|
 |
dddc06 |
+ };
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+ blorp_copy(batch, &src_blorp_surf, 0, 0, &dst_blorp_surf, 0, 0,
|
|
 |
dddc06 |
+ 0, 0, 0, 0, width, height);
|
|
 |
dddc06 |
+}
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+/* This is maximum possible width/height our HW can handle */
|
|
 |
dddc06 |
+#define MAX_SURFACE_DIM (1ull << 14)
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+void
|
|
 |
dddc06 |
+blorp_buffer_copy(struct blorp_batch *batch,
|
|
 |
dddc06 |
+ struct blorp_address src,
|
|
 |
dddc06 |
+ struct blorp_address dst,
|
|
 |
dddc06 |
+ uint64_t size)
|
|
 |
dddc06 |
+{
|
|
 |
dddc06 |
+ uint64_t copy_size = size;
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+ /* First, we compute the biggest format that can be used with the
|
|
 |
dddc06 |
+ * given offsets and size.
|
|
 |
dddc06 |
+ */
|
|
 |
dddc06 |
+ int bs = 16;
|
|
 |
dddc06 |
+ bs = gcd_pow2_u64(bs, src.offset);
|
|
 |
dddc06 |
+ bs = gcd_pow2_u64(bs, dst.offset);
|
|
 |
dddc06 |
+ bs = gcd_pow2_u64(bs, size);
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+ /* First, we make a bunch of max-sized copies */
|
|
 |
dddc06 |
+ uint64_t max_copy_size = MAX_SURFACE_DIM * MAX_SURFACE_DIM * bs;
|
|
 |
dddc06 |
+ while (copy_size >= max_copy_size) {
|
|
 |
dddc06 |
+ do_buffer_copy(batch, &src, &dst, MAX_SURFACE_DIM, MAX_SURFACE_DIM, bs);
|
|
 |
dddc06 |
+ copy_size -= max_copy_size;
|
|
 |
dddc06 |
+ src.offset += max_copy_size;
|
|
 |
dddc06 |
+ dst.offset += max_copy_size;
|
|
 |
dddc06 |
+ }
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+ /* Now make a max-width copy */
|
|
 |
dddc06 |
+ uint64_t height = copy_size / (MAX_SURFACE_DIM * bs);
|
|
 |
dddc06 |
+ assert(height < MAX_SURFACE_DIM);
|
|
 |
dddc06 |
+ if (height != 0) {
|
|
 |
dddc06 |
+ uint64_t rect_copy_size = height * MAX_SURFACE_DIM * bs;
|
|
 |
dddc06 |
+ do_buffer_copy(batch, &src, &dst, MAX_SURFACE_DIM, height, bs);
|
|
 |
dddc06 |
+ copy_size -= rect_copy_size;
|
|
 |
dddc06 |
+ src.offset += rect_copy_size;
|
|
 |
dddc06 |
+ dst.offset += rect_copy_size;
|
|
 |
dddc06 |
+ }
|
|
 |
dddc06 |
+
|
|
 |
dddc06 |
+ /* Finally, make a small copy to finish it off */
|
|
 |
dddc06 |
+ if (copy_size != 0) {
|
|
 |
dddc06 |
+ do_buffer_copy(batch, &src, &dst, copy_size / bs, 1, bs);
|
|
 |
dddc06 |
+ }
|
|
 |
dddc06 |
+}
|
|
 |
dddc06 |
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
|
|
 |
dddc06 |
index c00d38b52c..3a64b60178 100644
|
|
 |
dddc06 |
--- a/src/intel/vulkan/anv_blorp.c
|
|
 |
dddc06 |
+++ b/src/intel/vulkan/anv_blorp.c
|
|
 |
dddc06 |
@@ -546,56 +546,6 @@ isl_format_for_size(unsigned size_B)
|
|
 |
dddc06 |
}
|
|
 |
dddc06 |
}
|
|
 |
dddc06 |
|
|
 |
dddc06 |
-static void
|
|
 |
dddc06 |
-do_buffer_copy(struct blorp_batch *batch,
|
|
 |
dddc06 |
- struct anv_bo *src, uint64_t src_offset,
|
|
 |
dddc06 |
- struct anv_bo *dst, uint64_t dst_offset,
|
|
 |
dddc06 |
- int width, int height, int block_size)
|
|
 |
dddc06 |
-{
|
|
 |
dddc06 |
- struct anv_device *device = batch->blorp->driver_ctx;
|
|
 |
dddc06 |
-
|
|
 |
dddc06 |
- /* The actual format we pick doesn't matter as blorp will throw it away.
|
|
 |
dddc06 |
- * The only thing that actually matters is the size.
|
|
 |
dddc06 |
- */
|
|
 |
dddc06 |
- enum isl_format format = isl_format_for_size(block_size);
|
|
 |
dddc06 |
-
|
|
 |
dddc06 |
- UNUSED bool ok;
|
|
 |
dddc06 |
- struct isl_surf surf;
|
|
 |
dddc06 |
- ok = isl_surf_init(&device->isl_dev, &surf,
|
|
 |
dddc06 |
- .dim = ISL_SURF_DIM_2D,
|
|
 |
dddc06 |
- .format = format,
|
|
 |
dddc06 |
- .width = width,
|
|
 |
dddc06 |
- .height = height,
|
|
 |
dddc06 |
- .depth = 1,
|
|
 |
dddc06 |
- .levels = 1,
|
|
 |
dddc06 |
- .array_len = 1,
|
|
 |
dddc06 |
- .samples = 1,
|
|
 |
dddc06 |
- .row_pitch = width * block_size,
|
|
 |
dddc06 |
- .usage = ISL_SURF_USAGE_TEXTURE_BIT |
|
|
 |
dddc06 |
- ISL_SURF_USAGE_RENDER_TARGET_BIT,
|
|
 |
dddc06 |
- .tiling_flags = ISL_TILING_LINEAR_BIT);
|
|
 |
dddc06 |
- assert(ok);
|
|
 |
dddc06 |
-
|
|
 |
dddc06 |
- struct blorp_surf src_blorp_surf = {
|
|
 |
dddc06 |
- .surf = &surf,
|
|
 |
dddc06 |
- .addr = {
|
|
 |
dddc06 |
- .buffer = src,
|
|
 |
dddc06 |
- .offset = src_offset,
|
|
 |
dddc06 |
- },
|
|
 |
dddc06 |
- };
|
|
 |
dddc06 |
-
|
|
 |
dddc06 |
- struct blorp_surf dst_blorp_surf = {
|
|
 |
dddc06 |
- .surf = &surf,
|
|
 |
dddc06 |
- .addr = {
|
|
 |
dddc06 |
- .buffer = dst,
|
|
 |
dddc06 |
- .offset = dst_offset,
|
|
 |
dddc06 |
- },
|
|
 |
dddc06 |
- };
|
|
 |
dddc06 |
-
|
|
 |
dddc06 |
- blorp_copy(batch, &src_blorp_surf, 0, 0, &dst_blorp_surf, 0, 0,
|
|
 |
dddc06 |
- 0, 0, 0, 0, width, height);
|
|
 |
dddc06 |
-}
|
|
 |
dddc06 |
-
|
|
 |
dddc06 |
/**
|
|
 |
dddc06 |
* Returns the greatest common divisor of a and b that is a power of two.
|
|
 |
dddc06 |
*/
|
|
 |
dddc06 |
@@ -632,48 +582,16 @@ void anv_CmdCopyBuffer(
|
|
 |
dddc06 |
blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
|
|
 |
dddc06 |
|
|
 |
dddc06 |
for (unsigned r = 0; r < regionCount; r++) {
|
|
 |
dddc06 |
- uint64_t src_offset = src_buffer->offset + pRegions[r].srcOffset;
|
|
 |
dddc06 |
- uint64_t dst_offset = dst_buffer->offset + pRegions[r].dstOffset;
|
|
 |
dddc06 |
- uint64_t copy_size = pRegions[r].size;
|
|
 |
dddc06 |
-
|
|
 |
dddc06 |
- /* First, we compute the biggest format that can be used with the
|
|
 |
dddc06 |
- * given offsets and size.
|
|
 |
dddc06 |
- */
|
|
 |
dddc06 |
- int bs = 16;
|
|
 |
dddc06 |
- bs = gcd_pow2_u64(bs, src_offset);
|
|
 |
dddc06 |
- bs = gcd_pow2_u64(bs, dst_offset);
|
|
 |
dddc06 |
- bs = gcd_pow2_u64(bs, pRegions[r].size);
|
|
 |
dddc06 |
-
|
|
 |
dddc06 |
- /* First, we make a bunch of max-sized copies */
|
|
 |
dddc06 |
- uint64_t max_copy_size = MAX_SURFACE_DIM * MAX_SURFACE_DIM * bs;
|
|
 |
dddc06 |
- while (copy_size >= max_copy_size) {
|
|
 |
dddc06 |
- do_buffer_copy(&batch, src_buffer->bo, src_offset,
|
|
 |
dddc06 |
- dst_buffer->bo, dst_offset,
|
|
 |
dddc06 |
- MAX_SURFACE_DIM, MAX_SURFACE_DIM, bs);
|
|
 |
dddc06 |
- copy_size -= max_copy_size;
|
|
 |
dddc06 |
- src_offset += max_copy_size;
|
|
 |
dddc06 |
- dst_offset += max_copy_size;
|
|
 |
dddc06 |
- }
|
|
 |
dddc06 |
-
|
|
 |
dddc06 |
- /* Now make a max-width copy */
|
|
 |
dddc06 |
- uint64_t height = copy_size / (MAX_SURFACE_DIM * bs);
|
|
 |
dddc06 |
- assert(height < MAX_SURFACE_DIM);
|
|
 |
dddc06 |
- if (height != 0) {
|
|
 |
dddc06 |
- uint64_t rect_copy_size = height * MAX_SURFACE_DIM * bs;
|
|
 |
dddc06 |
- do_buffer_copy(&batch, src_buffer->bo, src_offset,
|
|
 |
dddc06 |
- dst_buffer->bo, dst_offset,
|
|
 |
dddc06 |
- MAX_SURFACE_DIM, height, bs);
|
|
 |
dddc06 |
- copy_size -= rect_copy_size;
|
|
 |
dddc06 |
- src_offset += rect_copy_size;
|
|
 |
dddc06 |
- dst_offset += rect_copy_size;
|
|
 |
dddc06 |
- }
|
|
 |
dddc06 |
+ struct blorp_address src = {
|
|
 |
dddc06 |
+ .buffer = src_buffer->bo,
|
|
 |
dddc06 |
+ .offset = src_buffer->offset + pRegions[r].srcOffset,
|
|
 |
dddc06 |
+ };
|
|
 |
dddc06 |
+ struct blorp_address dst = {
|
|
 |
dddc06 |
+ .buffer = dst_buffer->bo,
|
|
 |
dddc06 |
+ .offset = dst_buffer->offset + pRegions[r].dstOffset,
|
|
 |
dddc06 |
+ };
|
|
 |
dddc06 |
|
|
 |
dddc06 |
- /* Finally, make a small copy to finish it off */
|
|
 |
dddc06 |
- if (copy_size != 0) {
|
|
 |
dddc06 |
- do_buffer_copy(&batch, src_buffer->bo, src_offset,
|
|
 |
dddc06 |
- dst_buffer->bo, dst_offset,
|
|
 |
dddc06 |
- copy_size / bs, 1, bs);
|
|
 |
dddc06 |
- }
|
|
 |
dddc06 |
+ blorp_buffer_copy(&batch, src, dst, pRegions[r].size);
|
|
 |
dddc06 |
}
|
|
 |
dddc06 |
|
|
 |
dddc06 |
blorp_batch_finish(&batch);
|
|
 |
dddc06 |
@@ -715,15 +633,16 @@ void anv_CmdUpdateBuffer(
|
|
 |
dddc06 |
|
|
 |
dddc06 |
anv_state_flush(cmd_buffer->device, tmp_data);
|
|
 |
dddc06 |
|
|
 |
dddc06 |
- int bs = 16;
|
|
 |
dddc06 |
- bs = gcd_pow2_u64(bs, dstOffset);
|
|
 |
dddc06 |
- bs = gcd_pow2_u64(bs, copy_size);
|
|
 |
dddc06 |
+ struct blorp_address src = {
|
|
 |
dddc06 |
+ .buffer = &cmd_buffer->device->dynamic_state_pool.block_pool.bo,
|
|
 |
dddc06 |
+ .offset = tmp_data.offset,
|
|
 |
dddc06 |
+ };
|
|
 |
dddc06 |
+ struct blorp_address dst = {
|
|
 |
dddc06 |
+ .buffer = dst_buffer->bo,
|
|
 |
dddc06 |
+ .offset = dst_buffer->offset + dstOffset,
|
|
 |
dddc06 |
+ };
|
|
 |
dddc06 |
|
|
 |
dddc06 |
- do_buffer_copy(&batch,
|
|
 |
dddc06 |
- &cmd_buffer->device->dynamic_state_pool.block_pool.bo,
|
|
 |
dddc06 |
- tmp_data.offset,
|
|
 |
dddc06 |
- dst_buffer->bo, dst_buffer->offset + dstOffset,
|
|
 |
dddc06 |
- copy_size / bs, 1, bs);
|
|
 |
dddc06 |
+ blorp_buffer_copy(&batch, src, dst, copy_size);
|
|
 |
dddc06 |
|
|
 |
dddc06 |
dataSize -= copy_size;
|
|
 |
dddc06 |
dstOffset += copy_size;
|
|
 |
dddc06 |
--
|
|
 |
dddc06 |
2.14.3
|
|
 |
dddc06 |
|