Mesa (master): anv: Add a helper for working with VK_WHOLE_SIZE for buffers

Jason Ekstrand jekstrand at kemper.freedesktop.org
Mon Mar 13 14:59:05 UTC 2017


Module: Mesa
Branch: master
Commit: d36b46381754607f954c2cb6ee3843a84d6ca991
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d36b46381754607f954c2cb6ee3843a84d6ca991

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Sat Mar  4 10:07:56 2017 -0800

anv: Add a helper for working with VK_WHOLE_SIZE for buffers

Reviewed-by: Plamena Manolova <plamena.manolova at intel.com>

---

 src/intel/vulkan/anv_blorp.c          | 16 +++++++++++-----
 src/intel/vulkan/anv_descriptor_set.c |  7 +++----
 src/intel/vulkan/anv_image.c          |  4 ++--
 src/intel/vulkan/anv_private.h        | 12 ++++++++++++
 4 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
index d79c5e0..05790d2 100644
--- a/src/intel/vulkan/anv_blorp.c
+++ b/src/intel/vulkan/anv_blorp.c
@@ -722,11 +722,17 @@ void anv_CmdFillBuffer(
    struct blorp_batch batch;
    blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
 
-   if (fillSize == VK_WHOLE_SIZE) {
-      fillSize = dst_buffer->size - dstOffset;
-      /* Make sure fillSize is a multiple of 4 */
-      fillSize &= ~3ull;
-   }
+   fillSize = anv_buffer_get_range(dst_buffer, dstOffset, fillSize);
+
+   /* From the Vulkan spec:
+    *
+    *    "size is the number of bytes to fill, and must be either a multiple
+    *    of 4, or VK_WHOLE_SIZE to fill the range from offset to the end of
+    *    the buffer. If VK_WHOLE_SIZE is used and the remaining size of the
+    *    buffer is not a multiple of 4, then the nearest smaller multiple is
+    *    used."
+    */
+   fillSize &= ~3ull;
 
    /* First, we compute the biggest format that can be used with the
     * given offsets and size.
diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c
index 1e8991b..2a37d7d 100644
--- a/src/intel/vulkan/anv_descriptor_set.c
+++ b/src/intel/vulkan/anv_descriptor_set.c
@@ -672,10 +672,9 @@ anv_descriptor_set_write_buffer(struct anv_descriptor_set *set,
    /* For buffers with dynamic offsets, we use the full possible range in the
     * surface state and do the actual range-checking in the shader.
     */
-   if (bind_layout->dynamic_offset_index >= 0 || range == VK_WHOLE_SIZE)
-      bview->range = buffer->size - offset;
-   else
-      bview->range = range;
+   if (bind_layout->dynamic_offset_index >= 0)
+      range = VK_WHOLE_SIZE;
+   bview->range = anv_buffer_get_range(buffer, offset, range);
 
    /* If we're writing descriptors through a push command, we need to allocate
     * the surface state from the command buffer. Otherwise it will be
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
index b28d135..5f17351 100644
--- a/src/intel/vulkan/anv_image.c
+++ b/src/intel/vulkan/anv_image.c
@@ -837,8 +837,8 @@ anv_CreateBufferView(VkDevice _device,
    const uint32_t format_bs = isl_format_get_layout(view->format)->bpb / 8;
    view->bo = buffer->bo;
    view->offset = buffer->offset + pCreateInfo->offset;
-   view->range = pCreateInfo->range == VK_WHOLE_SIZE ?
-                 buffer->size - pCreateInfo->offset : pCreateInfo->range;
+   view->range = anv_buffer_get_range(buffer, pCreateInfo->offset,
+                                              pCreateInfo->range);
    view->range = align_down_npot_u32(view->range, format_bs);
 
    if (buffer->usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 3855416..5fb0c26 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -1082,6 +1082,18 @@ struct anv_buffer {
    VkDeviceSize                                 offset;
 };
 
+static inline uint64_t
+anv_buffer_get_range(struct anv_buffer *buffer, uint64_t offset, uint64_t range)
+{
+   assert(offset <= buffer->size);
+   if (range == VK_WHOLE_SIZE) {
+      return buffer->size - offset;
+   } else {
+      assert(range <= buffer->size);
+      return range;
+   }
+}
+
 enum anv_cmd_dirty_bits {
    ANV_CMD_DIRTY_DYNAMIC_VIEWPORT                  = 1 << 0, /* VK_DYNAMIC_STATE_VIEWPORT */
    ANV_CMD_DIRTY_DYNAMIC_SCISSOR                   = 1 << 1, /* VK_DYNAMIC_STATE_SCISSOR */




More information about the mesa-commit mailing list