aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2016-09-09 19:21:18 -0700
committerJason Ekstrand <[email protected]>2016-09-13 12:40:13 -0700
commit36286ccb9674c10255a61e096ac523e58c39c8cf (patch)
tree0cef5457c124b002c431d9b5dcbfd2699e14219d
parentaf5d30de55a4ccbef944f7fea16ce8f480a70039 (diff)
anv/blorp: Add a gcd_pow2_u64 helper and use it for buffer alignments
This is a lot cleaner and easier to read than the old piles of if statements. Signed-off-by: Jason Ekstrand <[email protected]> Reviewed-by: Nanley Chery <[email protected]>
-rw-r--r--src/intel/vulkan/anv_blorp.c48
1 files changed, 24 insertions, 24 deletions
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
index 2788a431a3f..72d7bea7fb7 100644
--- a/src/intel/vulkan/anv_blorp.c
+++ b/src/intel/vulkan/anv_blorp.c
@@ -537,6 +537,24 @@ do_buffer_copy(struct blorp_batch *batch,
0, 0, 0, 0, width, height);
}
+/**
+ * Returns the greatest common divisor of a and b that is a power of two.
+ */
+static inline uint64_t
+gcd_pow2_u64(uint64_t a, uint64_t b)
+{
+ assert(a > 0 || b > 0);
+
+ unsigned a_log2 = ffsll(a) - 1;
+ unsigned b_log2 = ffsll(b) - 1;
+
+ /* If either a or b is 0, then a_log2 or b_log2 till be UINT_MAX in which
+ * case, the MIN2() will take the other one. If both are 0 then we will
+ * hit the assert above.
+ */
+ return 1 << MIN2(a_log2, b_log2);
+}
+
/* This is maximum possible width/height our HW can handle */
#define MAX_SURFACE_DIM (1ull << 14)
@@ -563,21 +581,9 @@ void anv_CmdCopyBuffer(
* given offsets and size.
*/
int bs = 16;
-
- int fs = ffs(src_offset) - 1;
- if (fs != -1)
- bs = MIN2(bs, 1 << fs);
- assert(src_offset % bs == 0);
-
- fs = ffs(dst_offset) - 1;
- if (fs != -1)
- bs = MIN2(bs, 1 << fs);
- assert(dst_offset % bs == 0);
-
- fs = ffs(pRegions[r].size) - 1;
- if (fs != -1)
- bs = MIN2(bs, 1 << fs);
- assert(pRegions[r].size % bs == 0);
+ bs = gcd_pow2_u64(bs, src_offset);
+ bs = gcd_pow2_u64(bs, dst_offset);
+ bs = gcd_pow2_u64(bs, pRegions[r].size);
/* First, we make a bunch of max-sized copies */
uint64_t max_copy_size = MAX_SURFACE_DIM * MAX_SURFACE_DIM * bs;
@@ -643,15 +649,9 @@ void anv_CmdUpdateBuffer(
memcpy(tmp_data.map, pData, copy_size);
- int bs;
- if ((copy_size & 15) == 0 && (dstOffset & 15) == 0) {
- bs = 16;
- } else if ((copy_size & 7) == 0 && (dstOffset & 7) == 0) {
- bs = 8;
- } else {
- assert((copy_size & 3) == 0 && (dstOffset & 3) == 0);
- bs = 4;
- }
+ int bs = 16;
+ bs = gcd_pow2_u64(bs, dstOffset);
+ bs = gcd_pow2_u64(bs, copy_size);
do_buffer_copy(&batch,
&cmd_buffer->device->dynamic_state_block_pool.bo,