[Mesa-dev] [PATCH] radv: add support for layered clears (v2)

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Tue Jan 17 07:34:23 UTC 2017


Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

On Tue, Jan 17, 2017 at 1:07 AM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> Just always use the layer clear pipelines,
> the overhead of emitting the layer shouldn't be
> too large.
>
> v2: Bas suggested we always use it.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/amd/vulkan/radv_meta_clear.c | 28 ++++++++++++++++++++++------
>  1 file changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c
> index ff779ea..957b388 100644
> --- a/src/amd/vulkan/radv_meta_clear.c
> +++ b/src/amd/vulkan/radv_meta_clear.c
> @@ -98,6 +98,16 @@ build_color_shaders(struct nir_shader **out_vs,
>         nir_copy_var(&vs_b, vs_out_color, vs_in_color);
>         nir_copy_var(&fs_b, fs_out_color, fs_in_color);
>
> +       const struct glsl_type *layer_type = glsl_int_type();
> +       nir_variable *vs_out_layer =
> +               nir_variable_create(vs_b.shader, nir_var_shader_out, layer_type,
> +                                   "v_layer");
> +       vs_out_layer->data.location = VARYING_SLOT_LAYER;
> +       vs_out_layer->data.interpolation = INTERP_MODE_FLAT;
> +       nir_ssa_def *inst_id = nir_load_system_value(&vs_b, nir_intrinsic_load_instance_id, 0);
> +
> +       nir_store_var(&vs_b, vs_out_layer, inst_id, 0x1);
> +
>         *out_vs = vs_b.shader;
>         *out_fs = fs_b.shader;
>  }
> @@ -447,7 +457,7 @@ emit_color_clear(struct radv_cmd_buffer *cmd_buffer,
>                                            pipeline_h);
>         }
>
> -       radv_CmdDraw(cmd_buffer_h, 3, 1, 0, 0);
> +       radv_CmdDraw(cmd_buffer_h, 3, clear_rect->layerCount, 0, 0);
>
>         radv_cmd_buffer_set_subpass(cmd_buffer, subpass, false);
>  }
> @@ -477,6 +487,15 @@ build_depthstencil_shader(struct nir_shader **out_vs, struct nir_shader **out_fs
>
>         nir_copy_var(&vs_b, vs_out_pos, vs_in_pos);
>
> +       const struct glsl_type *layer_type = glsl_int_type();
> +       nir_variable *vs_out_layer =
> +               nir_variable_create(vs_b.shader, nir_var_shader_out, layer_type,
> +                                   "v_layer");
> +       vs_out_layer->data.location = VARYING_SLOT_LAYER;
> +       vs_out_layer->data.interpolation = INTERP_MODE_FLAT;
> +       nir_ssa_def *inst_id = nir_load_system_value(&vs_b, nir_intrinsic_load_instance_id, 0);
> +       nir_store_var(&vs_b, vs_out_layer, inst_id, 0x1);
> +
>         *out_vs = vs_b.shader;
>         *out_fs = fs_b.shader;
>  }
> @@ -717,7 +736,7 @@ emit_depthstencil_clear(struct radv_cmd_buffer *cmd_buffer,
>         if (depth_view_can_fast_clear(iview, subpass->depth_stencil_attachment.layout, clear_rect))
>                 radv_set_depth_clear_regs(cmd_buffer, iview->image, clear_value, aspects);
>
> -       radv_CmdDraw(cmd_buffer_h, 3, 1, 0, 0);
> +       radv_CmdDraw(cmd_buffer_h, 3, clear_rect->layerCount, 0, 0);
>  }
>
>
> @@ -948,13 +967,10 @@ radv_cmd_buffer_clear_subpass(struct radv_cmd_buffer *cmd_buffer)
>
>         radv_meta_save_graphics_reset_vport_scissor(&saved_state, cmd_buffer);
>
> -       if (cmd_state->framebuffer->layers > 1)
> -               radv_finishme("clearing multi-layer framebuffer");
> -
>         VkClearRect clear_rect = {
>                 .rect = cmd_state->render_area,
>                 .baseArrayLayer = 0,
> -               .layerCount = 1, /* FINISHME: clear multi-layer framebuffer */
> +               .layerCount = cmd_state->framebuffer->layers,
>         };
>
>         for (uint32_t i = 0; i < cmd_state->subpass->color_count; ++i) {
> --
> 2.9.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list