<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Mon, Jul 9, 2018 at 8:29 AM Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com">samuel.pitoiset@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
On 07/09/2018 05:28 PM, Jason Ekstrand wrote:<br>
> Are there any tests for this anywhere?<br>
<br>
Unfortunately, not yet.<br></blockquote><div><br></div><div>Someone should write some then. :-)  I recently wrote tests for VK_EXT_vertex_attribute_divisor and we discovered that basically no one (except RADV interestingly) implements the behavior as-written in the spec and Intel HW can't implemnet it as-written at all.  It's good to have tests. :)</div><div><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
> <br>
> On Mon, Jul 9, 2018 at 5:56 AM Samuel Pitoiset <br>
> <<a href="mailto:samuel.pitoiset@gmail.com" target="_blank">samuel.pitoiset@gmail.com</a> <mailto:<a href="mailto:samuel.pitoiset@gmail.com" target="_blank">samuel.pitoiset@gmail.com</a>>> wrote:<br>
> <br>
>     Inherited commands buffers are not supported.<br>
> <br>
>     v2: - disable predication for blit and copy commands<br>
> <br>
>     Signed-off-by: Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com" target="_blank">samuel.pitoiset@gmail.com</a><br>
>     <mailto:<a href="mailto:samuel.pitoiset@gmail.com" target="_blank">samuel.pitoiset@gmail.com</a>>><br>
>     ---<br>
>       src/amd/vulkan/radv_cmd_buffer.c  | 29 +++++++++++++++++++++++++++++<br>
>       src/amd/vulkan/radv_device.c      |  7 +++++++<br>
>       src/amd/vulkan/radv_extensions.py |  1 +<br>
>       src/amd/vulkan/radv_meta_blit.c   | 10 ++++++++++<br>
>       src/amd/vulkan/radv_meta_buffer.c | 10 ++++++++++<br>
>       src/amd/vulkan/radv_meta_copy.c   | 30 ++++++++++++++++++++++++++++++<br>
>       6 files changed, 87 insertions(+)<br>
> <br>
>     diff --git a/src/amd/vulkan/radv_cmd_buffer.c<br>
>     b/src/amd/vulkan/radv_cmd_buffer.c<br>
>     index 29199f2b3d..3fd8ebe2d3 100644<br>
>     --- a/src/amd/vulkan/radv_cmd_buffer.c<br>
>     +++ b/src/amd/vulkan/radv_cmd_buffer.c<br>
>     @@ -4376,3 +4376,32 @@ void radv_CmdSetDeviceMask(VkCommandBuffer<br>
>     commandBuffer,<br>
>       {<br>
>          /* No-op */<br>
>       }<br>
>     +<br>
>     +/* VK_EXT_conditional_rendering */<br>
>     +void vkCmdBeginConditionalRenderingEXT(<br>
>     +       VkCommandBuffer                             commandBuffer,<br>
>     +       const VkConditionalRenderingBeginInfoEXT* <br>
>       pConditionalRenderingBegin)<br>
>     +{<br>
>     +       RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);<br>
>     +       RADV_FROM_HANDLE(radv_buffer, buffer,<br>
>     pConditionalRenderingBegin->buffer);<br>
>     +       bool inverted;<br>
>     +       uint64_t va;<br>
>     +<br>
>     +       va = radv_buffer_get_va(buffer->bo) +<br>
>     pConditionalRenderingBegin->offset;<br>
>     +<br>
>     +       inverted = pConditionalRenderingBegin->flags &<br>
>     VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT;<br>
>     +<br>
>     +       /* Enable predication for this command buffer. */<br>
>     +       si_emit_set_predication_state(cmd_buffer, inverted, va);<br>
>     +       cmd_buffer->state.predicating = true;<br>
>     +}<br>
>     +<br>
>     +void vkCmdEndConditionalRenderingEXT(<br>
>     +       VkCommandBuffer                             commandBuffer)<br>
>     +{<br>
>     +       RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);<br>
>     +<br>
>     +       /* Disable predication for this command buffer. */<br>
>     +       si_emit_set_predication_state(cmd_buffer, false, 0);<br>
>     +       cmd_buffer->state.predicating = false;<br>
>     +}<br>
>     diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c<br>
>     index ad3465f594..06d70d305a 100644<br>
>     --- a/src/amd/vulkan/radv_device.c<br>
>     +++ b/src/amd/vulkan/radv_device.c<br>
>     @@ -806,6 +806,13 @@ void radv_GetPhysicalDeviceFeatures2(<br>
>                              features->runtimeDescriptorArray = true;<br>
>                              break;<br>
>                      }<br>
>     +               case<br>
>     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {<br>
>     +                     <br>
>       VkPhysicalDeviceConditionalRenderingFeaturesEXT *features =<br>
>     +                             <br>
>       (VkPhysicalDeviceConditionalRenderingFeaturesEXT*)ext;<br>
>     +                       features->conditionalRendering = true;<br>
>     +                       features->inheritedConditionalRendering = false;<br>
>     +                       break;<br>
>     +               }<br>
>                      default:<br>
>                              break;<br>
>                      }<br>
>     diff --git a/src/amd/vulkan/radv_extensions.py<br>
>     b/src/amd/vulkan/radv_extensions.py<br>
>     index a0f1038110..6ddbabf26e 100644<br>
>     --- a/src/amd/vulkan/radv_extensions.py<br>
>     +++ b/src/amd/vulkan/radv_extensions.py<br>
>     @@ -89,6 +89,7 @@ EXTENSIONS = [<br>
>           Extension('VK_KHR_display',                          23,<br>
>     'VK_USE_PLATFORM_DISPLAY_KHR'),<br>
>           Extension('VK_EXT_direct_mode_display',               1,<br>
>     'VK_USE_PLATFORM_DISPLAY_KHR'),<br>
>           Extension('VK_EXT_acquire_xlib_display',              1,<br>
>     'VK_USE_PLATFORM_XLIB_XRANDR_EXT'),<br>
>     +    Extension('VK_EXT_conditional_rendering',             1, True),<br>
>           Extension('VK_EXT_display_surface_counter',           1,<br>
>     'VK_USE_PLATFORM_DISPLAY_KHR'),<br>
>           Extension('VK_EXT_display_control',                   1,<br>
>     'VK_USE_PLATFORM_DISPLAY_KHR'),<br>
>           Extension('VK_EXT_debug_report',                      9, True),<br>
>     diff --git a/src/amd/vulkan/radv_meta_blit.c<br>
>     b/src/amd/vulkan/radv_meta_blit.c<br>
>     index a6ee0cb7e9..67c26aabdb 100644<br>
>     --- a/src/amd/vulkan/radv_meta_blit.c<br>
>     +++ b/src/amd/vulkan/radv_meta_blit.c<br>
>     @@ -520,6 +520,7 @@ void radv_CmdBlitImage(<br>
>              RADV_FROM_HANDLE(radv_image, src_image, srcImage);<br>
>              RADV_FROM_HANDLE(radv_image, dest_image, destImage);<br>
>              struct radv_meta_saved_state saved_state;<br>
>     +       bool old_predicating;<br>
> <br>
>              /* From the Vulkan 1.0 spec:<br>
>               *<br>
>     @@ -534,6 +535,12 @@ void radv_CmdBlitImage(<br>
>                             RADV_META_SAVE_CONSTANTS |<br>
>                             RADV_META_SAVE_DESCRIPTORS);<br>
> <br>
>     +       /* VK_EXT_conditional_rendering says that blit commands<br>
>     should not be<br>
>     +        * affected by conditional rendering.<br>
>     +        */<br>
>     +       old_predicating = cmd_buffer->state.predicating;<br>
>     +       cmd_buffer->state.predicating = false;<br>
>     +<br>
>              for (unsigned r = 0; r < regionCount; r++) {<br>
>                      const VkImageSubresourceLayers *src_res =<br>
>     &pRegions[r].srcSubresource;<br>
>                      const VkImageSubresourceLayers *dst_res =<br>
>     &pRegions[r].dstSubresource;<br>
>     @@ -648,6 +655,9 @@ void radv_CmdBlitImage(<br>
>                      }<br>
>              }<br>
> <br>
>     +       /* Restore conditional rendering. */<br>
>     +       cmd_buffer->state.predicating = old_predicating;<br>
>     +<br>
>              radv_meta_restore(&saved_state, cmd_buffer);<br>
>       }<br>
> <br>
>     diff --git a/src/amd/vulkan/radv_meta_buffer.c<br>
>     b/src/amd/vulkan/radv_meta_buffer.c<br>
>     index 2e1ba2c7b2..a45a6d5aac 100644<br>
>     --- a/src/amd/vulkan/radv_meta_buffer.c<br>
>     +++ b/src/amd/vulkan/radv_meta_buffer.c<br>
>     @@ -472,6 +472,13 @@ void radv_CmdCopyBuffer(<br>
>              RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);<br>
>              RADV_FROM_HANDLE(radv_buffer, src_buffer, srcBuffer);<br>
>              RADV_FROM_HANDLE(radv_buffer, dest_buffer, destBuffer);<br>
>     +       bool old_predicating;<br>
>     +<br>
>     +       /* VK_EXT_conditional_rendering says that copy commands<br>
>     should not be<br>
>     +        * affected by conditional rendering.<br>
>     +        */<br>
>     +       old_predicating = cmd_buffer->state.predicating;<br>
>     +       cmd_buffer->state.predicating = false;<br>
> <br>
>              for (unsigned r = 0; r < regionCount; r++) {<br>
>                      uint64_t src_offset = src_buffer->offset +<br>
>     pRegions[r].srcOffset;<br>
>     @@ -481,6 +488,9 @@ void radv_CmdCopyBuffer(<br>
>                      radv_copy_buffer(cmd_buffer, src_buffer->bo,<br>
>     dest_buffer->bo,<br>
>                                       src_offset, dest_offset, copy_size);<br>
>              }<br>
>     +<br>
>     +       /* Restore conditional rendering. */<br>
>     +       cmd_buffer->state.predicating = old_predicating;<br>
>       }<br>
> <br>
>       void radv_CmdUpdateBuffer(<br>
>     diff --git a/src/amd/vulkan/radv_meta_copy.c<br>
>     b/src/amd/vulkan/radv_meta_copy.c<br>
>     index 3442b49fb9..f4de5528ed 100644<br>
>     --- a/src/amd/vulkan/radv_meta_copy.c<br>
>     +++ b/src/amd/vulkan/radv_meta_copy.c<br>
>     @@ -117,6 +117,7 @@ meta_copy_buffer_to_image(struct radv_cmd_buffer<br>
>     *cmd_buffer,<br>
>       {<br>
>              bool cs = cmd_buffer->queue_family_index == RADV_QUEUE_COMPUTE;<br>
>              struct radv_meta_saved_state saved_state;<br>
>     +       bool old_predicating;<br>
> <br>
>              /* The Vulkan 1.0 spec says "dstImage must have a sample<br>
>     count equal to<br>
>               * VK_SAMPLE_COUNT_1_BIT."<br>
>     @@ -129,6 +130,12 @@ meta_copy_buffer_to_image(struct<br>
>     radv_cmd_buffer *cmd_buffer,<br>
>                             RADV_META_SAVE_CONSTANTS |<br>
>                             RADV_META_SAVE_DESCRIPTORS);<br>
> <br>
>     +       /* VK_EXT_conditional_rendering says that copy commands<br>
>     should not be<br>
>     +        * affected by conditional rendering.<br>
>     +        */<br>
>     +       old_predicating = cmd_buffer->state.predicating;<br>
>     +       cmd_buffer->state.predicating = false;<br>
>     +<br>
>              for (unsigned r = 0; r < regionCount; r++) {<br>
> <br>
>                      /**<br>
>     @@ -208,6 +215,9 @@ meta_copy_buffer_to_image(struct radv_cmd_buffer<br>
>     *cmd_buffer,<br>
>                      }<br>
>              }<br>
> <br>
>     +       /* Restore conditional rendering. */<br>
>     +       cmd_buffer->state.predicating = old_predicating;<br>
>     +<br>
>              radv_meta_restore(&saved_state, cmd_buffer);<br>
>       }<br>
> <br>
>     @@ -236,12 +246,19 @@ meta_copy_image_to_buffer(struct<br>
>     radv_cmd_buffer *cmd_buffer,<br>
>                                 const VkBufferImageCopy* pRegions)<br>
>       {<br>
>              struct radv_meta_saved_state saved_state;<br>
>     +       bool old_predicating;<br>
> <br>
>              radv_meta_save(&saved_state, cmd_buffer,<br>
>                             RADV_META_SAVE_COMPUTE_PIPELINE |<br>
>                             RADV_META_SAVE_CONSTANTS |<br>
>                             RADV_META_SAVE_DESCRIPTORS);<br>
> <br>
>     +       /* VK_EXT_conditional_rendering says that copy commands<br>
>     should not be<br>
>     +        * affected by conditional rendering.<br>
>     +        */<br>
>     +       old_predicating = cmd_buffer->state.predicating;<br>
>     +       cmd_buffer->state.predicating = false;<br>
>     +<br>
>              for (unsigned r = 0; r < regionCount; r++) {<br>
> <br>
>                      /**<br>
>     @@ -313,6 +330,9 @@ meta_copy_image_to_buffer(struct radv_cmd_buffer<br>
>     *cmd_buffer,<br>
>                      }<br>
>              }<br>
> <br>
>     +       /* Restore conditional rendering. */<br>
>     +       cmd_buffer->state.predicating = old_predicating;<br>
>     +<br>
>              radv_meta_restore(&saved_state, cmd_buffer);<br>
>       }<br>
> <br>
>     @@ -344,6 +364,7 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer,<br>
>       {<br>
>              bool cs = cmd_buffer->queue_family_index == RADV_QUEUE_COMPUTE;<br>
>              struct radv_meta_saved_state saved_state;<br>
>     +       bool old_predicating;<br>
> <br>
>              /* From the Vulkan 1.0 spec:<br>
>               *<br>
>     @@ -358,6 +379,12 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer,<br>
>                             RADV_META_SAVE_CONSTANTS |<br>
>                             RADV_META_SAVE_DESCRIPTORS);<br>
> <br>
>     +       /* VK_EXT_conditional_rendering says that copy commands<br>
>     should not be<br>
>     +        * affected by conditional rendering.<br>
>     +        */<br>
>     +       old_predicating = cmd_buffer->state.predicating;<br>
>     +       cmd_buffer->state.predicating = false;<br>
>     +<br>
>              for (unsigned r = 0; r < regionCount; r++) {<br>
>                      assert(pRegions[r].srcSubresource.aspectMask ==<br>
>                             pRegions[r].dstSubresource.aspectMask);<br>
>     @@ -465,6 +492,9 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer,<br>
>                      }<br>
>              }<br>
> <br>
>     +       /* Restore conditional rendering. */<br>
>     +       cmd_buffer->state.predicating = old_predicating;<br>
>     +<br>
>              radv_meta_restore(&saved_state, cmd_buffer);<br>
>       }<br>
> <br>
>     -- <br>
>     2.18.0<br>
> <br>
>     _______________________________________________<br>
>     mesa-dev mailing list<br>
>     <a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a> <mailto:<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">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/mailman/listinfo/mesa-dev</a><br>
> <br>
</blockquote></div></div>