On 10 January 2018 at 12:34, Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> wrote:
> Tested with a modified deferred demo and no regressions in a 1.0.2
> mustpass run.

For the series:

Reviewed-by: Dave Airlie <airl...@redhat.com>

> ---
>  src/amd/vulkan/radv_cmd_buffer.c  | 51 
> +++++++++++++++++++++++++++++++++++++++
>  src/amd/vulkan/radv_device.c      |  6 +++++
>  src/amd/vulkan/radv_extensions.py |  1 +
>  src/amd/vulkan/radv_pipeline.c    | 35 +++++++++++++++++++++++++++
>  src/amd/vulkan/radv_private.h     | 23 +++++++++++++-----
>  5 files changed, 110 insertions(+), 6 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_cmd_buffer.c 
> b/src/amd/vulkan/radv_cmd_buffer.c
> index 3114ae9fb4..4c42dc2b13 100644
> --- a/src/amd/vulkan/radv_cmd_buffer.c
> +++ b/src/amd/vulkan/radv_cmd_buffer.c
> @@ -91,6 +91,7 @@ radv_bind_dynamic_state(struct radv_cmd_buffer *cmd_buffer,
>          */
>         dest->viewport.count = src->viewport.count;
>         dest->scissor.count = src->scissor.count;
> +       dest->discard_rectangle.count = src->discard_rectangle.count;
>
>         if (copy_mask & RADV_DYNAMIC_VIEWPORT) {
>                 if (memcmp(&dest->viewport.viewports, 
> &src->viewport.viewports,
> @@ -168,6 +169,16 @@ radv_bind_dynamic_state(struct radv_cmd_buffer 
> *cmd_buffer,
>                 }
>         }
>
> +       if (copy_mask & RADV_DYNAMIC_DISCARD_RECTANGLE) {
> +               if (memcmp(&dest->discard_rectangle.rectangles, 
> &src->discard_rectangle.rectangles,
> +                          src->discard_rectangle.count * sizeof(VkRect2D))) {
> +                       typed_memcpy(dest->discard_rectangle.rectangles,
> +                                    src->discard_rectangle.rectangles,
> +                                    src->discard_rectangle.count);
> +                       dest_mask |= RADV_DYNAMIC_DISCARD_RECTANGLE;
> +               }
> +       }
> +
>         cmd_buffer->state.dirty |= dest_mask;
>  }
>
> @@ -1098,6 +1109,8 @@ radv_emit_graphics_pipeline(struct radv_cmd_buffer 
> *cmd_buffer)
>         }
>         radeon_set_context_reg(cmd_buffer->cs, R_028A6C_VGT_GS_OUT_PRIM_TYPE, 
> pipeline->graphics.gs_out);
>
> +       radeon_set_context_reg(cmd_buffer->cs, R_02820C_PA_SC_CLIPRECT_RULE, 
> pipeline->graphics.pa_sc_cliprect_rule);
> +
>         if (unlikely(cmd_buffer->device->trace_bo))
>                 radv_save_pipeline(cmd_buffer, pipeline, RING_GFX);
>
> @@ -1134,6 +1147,22 @@ radv_emit_scissor(struct radv_cmd_buffer *cmd_buffer)
>                                
> cmd_buffer->state.pipeline->graphics.ms.pa_sc_mode_cntl_0 | 
> S_028A48_VPORT_SCISSOR_ENABLE(count ? 1 : 0));
>  }
>
> +static void
> +radv_emit_discard_rectangle(struct radv_cmd_buffer *cmd_buffer)
> +{
> +       if (!cmd_buffer->state.dynamic.discard_rectangle.count)
> +               return;
> +
> +       radeon_set_context_reg_seq(cmd_buffer->cs, 
> R_028210_PA_SC_CLIPRECT_0_TL,
> +                                  
> cmd_buffer->state.dynamic.discard_rectangle.count * 2);
> +       for (unsigned i = 0; i < 
> cmd_buffer->state.dynamic.discard_rectangle.count; ++i) {
> +               VkRect2D rect = 
> cmd_buffer->state.dynamic.discard_rectangle.rectangles[i];
> +               radeon_emit(cmd_buffer->cs, S_028210_TL_X(rect.offset.x) | 
> S_028210_TL_Y(rect.offset.y));
> +               radeon_emit(cmd_buffer->cs, S_028214_BR_X(rect.offset.x + 
> rect.extent.width) |
> +                                           S_028214_BR_Y(rect.offset.y + 
> rect.extent.height));
> +       }
> +}
> +
>  static void
>  radv_emit_line_width(struct radv_cmd_buffer *cmd_buffer)
>  {
> @@ -1627,6 +1656,9 @@ radv_cmd_buffer_flush_dynamic_state(struct 
> radv_cmd_buffer *cmd_buffer)
>                                        RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS))
>                 radv_emit_depth_biais(cmd_buffer);
>
> +       if (cmd_buffer->state.dirty & 
> RADV_CMD_DIRTY_DYNAMIC_DISCARD_RECTANGLE)
> +               radv_emit_discard_rectangle(cmd_buffer);
> +
>         cmd_buffer->state.dirty &= ~RADV_CMD_DIRTY_DYNAMIC_ALL;
>  }
>
> @@ -2882,6 +2914,25 @@ void radv_CmdSetStencilReference(
>         cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE;
>  }
>
> +void radv_CmdSetDiscardRectangleEXT(
> +       VkCommandBuffer                             commandBuffer,
> +       uint32_t                                    firstDiscardRectangle,
> +       uint32_t                                    discardRectangleCount,
> +       const VkRect2D*                             pDiscardRectangles)
> +{
> +       RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
> +       struct radv_cmd_state *state = &cmd_buffer->state;
> +       MAYBE_UNUSED const uint32_t total_count = firstDiscardRectangle + 
> discardRectangleCount;
> +
> +       assert(firstDiscardRectangle < MAX_DISCARD_RECTANGLES);
> +       assert(total_count >= 1 && total_count <= MAX_DISCARD_RECTANGLES);
> +
> +
> +       
> typed_memcpy(&state->dynamic.discard_rectangle.rectangles[firstDiscardRectangle],
> +                    pDiscardRectangles, discardRectangleCount);
> +
> +       state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DISCARD_RECTANGLE;
> +}
>  void radv_CmdExecuteCommands(
>         VkCommandBuffer                             commandBuffer,
>         uint32_t                                    commandBufferCount,
> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
> index 4270e6a870..baffa41d31 100644
> --- a/src/amd/vulkan/radv_device.c
> +++ b/src/amd/vulkan/radv_device.c
> @@ -794,6 +794,12 @@ void radv_GetPhysicalDeviceProperties2KHR(
>                         properties->pointClippingBehavior = 
> VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES_KHR;
>                         break;
>                 }
> +               case  
> VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
> +                       VkPhysicalDeviceDiscardRectanglePropertiesEXT 
> *properties =
> +                           
> (VkPhysicalDeviceDiscardRectanglePropertiesEXT*)ext;
> +                       properties->maxDiscardRectangles = 
> MAX_DISCARD_RECTANGLES;
> +                       break;
> +               }
>                 default:
>                         break;
>                 }
> diff --git a/src/amd/vulkan/radv_extensions.py 
> b/src/amd/vulkan/radv_extensions.py
> index 6bdb011d6c..9980cfc398 100644
> --- a/src/amd/vulkan/radv_extensions.py
> +++ b/src/amd/vulkan/radv_extensions.py
> @@ -81,6 +81,7 @@ EXTENSIONS = [
>      Extension('VK_KHR_xcb_surface',                       6, 
> 'VK_USE_PLATFORM_XCB_KHR'),
>      Extension('VK_KHR_xlib_surface',                      6, 
> 'VK_USE_PLATFORM_XLIB_KHR'),
>      Extension('VK_KHX_multiview',                         1, True),
> +    Extension('VK_EXT_discard_rectangles',                1, True),
>      Extension('VK_EXT_external_memory_dma_buf',           1, True),
>      Extension('VK_EXT_global_priority',                   1, 
> 'device->rad_info.has_ctx_priority'),
>      Extension('VK_AMD_draw_indirect_count',               1, True),
> diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
> index 9ece79ef21..3f95ab3f5b 100644
> --- a/src/amd/vulkan/radv_pipeline.c
> +++ b/src/amd/vulkan/radv_pipeline.c
> @@ -1006,6 +1006,8 @@ static unsigned radv_dynamic_state_mask(VkDynamicState 
> state)
>                 return RADV_DYNAMIC_STENCIL_WRITE_MASK;
>         case VK_DYNAMIC_STATE_STENCIL_REFERENCE:
>                 return RADV_DYNAMIC_STENCIL_REFERENCE;
> +       case VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT:
> +               return RADV_DYNAMIC_DISCARD_RECTANGLE;
>         default:
>                 unreachable("Unhandled dynamic state");
>         }
> @@ -1133,6 +1135,39 @@ radv_pipeline_init_dynamic_state(struct radv_pipeline 
> *pipeline,
>                 }
>         }
>
> +       const  VkPipelineDiscardRectangleStateCreateInfoEXT 
> *discard_rectangle_info =
> +                       vk_find_struct_const(pCreateInfo->pNext, 
> PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT);
> +       if (discard_rectangle_info) {
> +               dynamic->discard_rectangle.count = 
> discard_rectangle_info->discardRectangleCount;
> +               typed_memcpy(dynamic->discard_rectangle.rectangles,
> +                            discard_rectangle_info->pDiscardRectangles,
> +                            discard_rectangle_info->discardRectangleCount);
> +
> +               unsigned mask = 0;
> +
> +               for (unsigned i = 0; i < 16; ++i) {
> +                       /* Interpret i as a bitmask, and then set the bit in 
> the mask if
> +                        * that combination of rectangles in which the pixel 
> is contained
> +                        * should pass the cliprect test. */
> +                       unsigned relevant_subset = i & ((1u << 
> discard_rectangle_info->discardRectangleCount) - 1);
> +
> +                       if (discard_rectangle_info->discardRectangleMode == 
> VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT &&
> +                           !relevant_subset)
> +                               continue;
> +
> +                       if (discard_rectangle_info->discardRectangleMode == 
> VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT &&
> +                           relevant_subset)
> +                               continue;
> +
> +                       mask |= 1u << i;
> +               }
> +               pipeline->graphics.pa_sc_cliprect_rule = mask;
> +       } else {
> +               states &= ~RADV_DYNAMIC_DISCARD_RECTANGLE;
> +
> +               /* Allow from all rectangle combinations */
> +               pipeline->graphics.pa_sc_cliprect_rule = 0xffff;
> +       }
>         pipeline->dynamic_state.mask = states;
>  }
>
> diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
> index b7c53d03fb..7330dc6369 100644
> --- a/src/amd/vulkan/radv_private.h
> +++ b/src/amd/vulkan/radv_private.h
> @@ -81,6 +81,7 @@ typedef uint32_t xcb_window_t;
>  #define MAX_RTS          8
>  #define MAX_VIEWPORTS   16
>  #define MAX_SCISSORS    16
> +#define MAX_DISCARD_RECTANGLES 4
>  #define MAX_PUSH_CONSTANTS_SIZE 128
>  #define MAX_PUSH_DESCRIPTORS 32
>  #define MAX_DYNAMIC_BUFFERS 16
> @@ -739,7 +740,8 @@ enum radv_dynamic_state_bits {
>         RADV_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 6,
>         RADV_DYNAMIC_STENCIL_WRITE_MASK   = 1 << 7,
>         RADV_DYNAMIC_STENCIL_REFERENCE    = 1 << 8,
> -       RADV_DYNAMIC_ALL                  = (1 << 9) - 1,
> +       RADV_DYNAMIC_DISCARD_RECTANGLE    = 1 << 9,
> +       RADV_DYNAMIC_ALL                  = (1 << 10) - 1,
>  };
>
>  enum radv_cmd_dirty_bits {
> @@ -754,11 +756,12 @@ enum radv_cmd_dirty_bits {
>         RADV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK      = 1 << 6,
>         RADV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK        = 1 << 7,
>         RADV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE         = 1 << 8,
> -       RADV_CMD_DIRTY_DYNAMIC_ALL                       = (1 << 9) - 1,
> -       RADV_CMD_DIRTY_PIPELINE                          = 1 << 9,
> -       RADV_CMD_DIRTY_INDEX_BUFFER                      = 1 << 10,
> -       RADV_CMD_DIRTY_FRAMEBUFFER                       = 1 << 11,
> -       RADV_CMD_DIRTY_VERTEX_BUFFER                     = 1 << 12,
> +       RADV_CMD_DIRTY_DYNAMIC_DISCARD_RECTANGLE         = 1 << 9,
> +       RADV_CMD_DIRTY_DYNAMIC_ALL                       = (1 << 10) - 1,
> +       RADV_CMD_DIRTY_PIPELINE                          = 1 << 10,
> +       RADV_CMD_DIRTY_INDEX_BUFFER                      = 1 << 11,
> +       RADV_CMD_DIRTY_FRAMEBUFFER                       = 1 << 12,
> +       RADV_CMD_DIRTY_VERTEX_BUFFER                     = 1 << 13,
>  };
>
>  enum radv_cmd_flush_bits {
> @@ -803,6 +806,11 @@ struct radv_scissor_state {
>         VkRect2D                                          
> scissors[MAX_SCISSORS];
>  };
>
> +struct radv_discard_rectangle_state {
> +       uint32_t                                          count;
> +       VkRect2D                                          
> rectangles[MAX_DISCARD_RECTANGLES];
> +};
> +
>  struct radv_dynamic_state {
>         /**
>          * Bitmask of (1 << VK_DYNAMIC_STATE_*).
> @@ -843,6 +851,8 @@ struct radv_dynamic_state {
>                 uint32_t                                  front;
>                 uint32_t                                  back;
>         } stencil_reference;
> +
> +       struct radv_discard_rectangle_state               discard_rectangle;
>  };
>
>  extern const struct radv_dynamic_state default_dynamic_state;
> @@ -1239,6 +1249,7 @@ struct radv_pipeline {
>                         uint32_t vtx_reuse_depth;
>                         struct radv_prim_vertex_count prim_vertex_count;
>                         bool can_use_guardband;
> +                       uint32_t pa_sc_cliprect_rule;
>                 } graphics;
>         };
>
> --
> 2.15.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to