<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>