<div dir="ltr">Reviewed-by: Plamena Manolova <<a href="mailto:plamena.manolova@intel.com">plamena.manolova@intel.com</a>></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Mar 4, 2017 at 8:47 PM, Jason Ekstrand <span dir="ltr"><<a href="mailto:jason@jlekstrand.net" target="_blank">jason@jlekstrand.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">---<br>
 src/intel/vulkan/anv_blorp.c          | 16 +++++++++++-----<br>
 src/intel/vulkan/anv_<wbr>descriptor_set.c |  7 +++----<br>
 src/intel/vulkan/anv_image.c          |  4 ++--<br>
 src/intel/vulkan/anv_private.h        | 12 ++++++++++++<br>
 4 files changed, 28 insertions(+), 11 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c<br>
index d79c5e0..05790d2 100644<br>
--- a/src/intel/vulkan/anv_blorp.c<br>
+++ b/src/intel/vulkan/anv_blorp.c<br>
@@ -722,11 +722,17 @@ void anv_CmdFillBuffer(<br>
    struct blorp_batch batch;<br>
    blorp_batch_init(&cmd_buffer-><wbr>device->blorp, &batch, cmd_buffer, 0);<br>
<br>
-   if (fillSize == VK_WHOLE_SIZE) {<br>
-      fillSize = dst_buffer->size - dstOffset;<br>
-      /* Make sure fillSize is a multiple of 4 */<br>
-      fillSize &= ~3ull;<br>
-   }<br>
+   fillSize = anv_buffer_get_range(dst_<wbr>buffer, dstOffset, fillSize);<br>
+<br>
+   /* From the Vulkan spec:<br>
+    *<br>
+    *    "size is the number of bytes to fill, and must be either a multiple<br>
+    *    of 4, or VK_WHOLE_SIZE to fill the range from offset to the end of<br>
+    *    the buffer. If VK_WHOLE_SIZE is used and the remaining size of the<br>
+    *    buffer is not a multiple of 4, then the nearest smaller multiple is<br>
+    *    used."<br>
+    */<br>
+   fillSize &= ~3ull;<br>
<br>
    /* First, we compute the biggest format that can be used with the<br>
     * given offsets and size.<br>
diff --git a/src/intel/vulkan/anv_<wbr>descriptor_set.c b/src/intel/vulkan/anv_<wbr>descriptor_set.c<br>
index 1e8991b..2a37d7d 100644<br>
--- a/src/intel/vulkan/anv_<wbr>descriptor_set.c<br>
+++ b/src/intel/vulkan/anv_<wbr>descriptor_set.c<br>
@@ -672,10 +672,9 @@ anv_descriptor_set_write_<wbr>buffer(struct anv_descriptor_set *set,<br>
    /* For buffers with dynamic offsets, we use the full possible range in the<br>
     * surface state and do the actual range-checking in the shader.<br>
     */<br>
-   if (bind_layout->dynamic_offset_<wbr>index >= 0 || range == VK_WHOLE_SIZE)<br>
-      bview->range = buffer->size - offset;<br>
-   else<br>
-      bview->range = range;<br>
+   if (bind_layout->dynamic_offset_<wbr>index >= 0)<br>
+      range = VK_WHOLE_SIZE;<br>
+   bview->range = anv_buffer_get_range(buffer, offset, range);<br>
<br>
    /* If we're writing descriptors through a push command, we need to allocate<br>
     * the surface state from the command buffer. Otherwise it will be<br>
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c<br>
index 59f730c..f54c8ea 100644<br>
--- a/src/intel/vulkan/anv_image.c<br>
+++ b/src/intel/vulkan/anv_image.c<br>
@@ -837,8 +837,8 @@ anv_CreateBufferView(VkDevice _device,<br>
    const uint32_t format_bs = isl_format_get_layout(view-><wbr>format)->bpb / 8;<br>
    view->bo = buffer->bo;<br>
    view->offset = buffer->offset + pCreateInfo->offset;<br>
-   view->range = pCreateInfo->range == VK_WHOLE_SIZE ?<br>
-                 buffer->size - pCreateInfo->offset : pCreateInfo->range;<br>
+   view->range = anv_buffer_get_range(buffer, pCreateInfo->offset,<br>
+                                              pCreateInfo->range);<br>
    view->range = align_down_npot_u32(view-><wbr>range, format_bs);<br>
<br>
    if (buffer->usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_<wbr>BUFFER_BIT) {<br>
diff --git a/src/intel/vulkan/anv_<wbr>private.h b/src/intel/vulkan/anv_<wbr>private.h<br>
index c73196a..cf9874e 100644<br>
--- a/src/intel/vulkan/anv_<wbr>private.h<br>
+++ b/src/intel/vulkan/anv_<wbr>private.h<br>
@@ -1090,6 +1090,18 @@ struct anv_buffer {<br>
    VkDeviceSize                                 offset;<br>
 };<br>
<br>
+static inline uint64_t<br>
+anv_buffer_get_range(struct anv_buffer *buffer, uint64_t offset, uint64_t range)<br>
+{<br>
+   assert(offset <= buffer->size);<br>
+   if (range == VK_WHOLE_SIZE) {<br>
+      return buffer->size - offset;<br>
+   } else {<br>
+      assert(range <= buffer->size);<br>
+      return range;<br>
+   }<br>
+}<br>
+<br>
 enum anv_cmd_dirty_bits {<br>
    ANV_CMD_DIRTY_DYNAMIC_VIEWPORT                  = 1 << 0, /* VK_DYNAMIC_STATE_VIEWPORT */<br>
    ANV_CMD_DIRTY_DYNAMIC_SCISSOR                   = 1 << 1, /* VK_DYNAMIC_STATE_SCISSOR */<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.5.0.400.gff86faf<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>