From: Samuel Pitoiset Date: Thu, 17 Oct 2019 12:57:04 +0000 (+0200) Subject: radv: create decompress pipelines for separate depth/stencil layouts X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=905c005561015957da8faf1613034521f8ac42ca;p=mesa.git radv: create decompress pipelines for separate depth/stencil layouts No functional changes as the driver still uses the depth+stencil pipeline. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- diff --git a/src/amd/vulkan/radv_constants.h b/src/amd/vulkan/radv_constants.h index 7e33d0c584f..6abcf085206 100644 --- a/src/amd/vulkan/radv_constants.h +++ b/src/amd/vulkan/radv_constants.h @@ -53,6 +53,7 @@ #define MAX_INLINE_UNIFORM_BLOCK_COUNT 64 #define NUM_DEPTH_CLEAR_PIPELINES 3 +#define NUM_DEPTH_DECOMPRESS_PIPELINES 3 /* * This is the point we switch from using CP to compute shader diff --git a/src/amd/vulkan/radv_meta_decompress.c b/src/amd/vulkan/radv_meta_decompress.c index db1579be8aa..39340c7a778 100644 --- a/src/amd/vulkan/radv_meta_decompress.c +++ b/src/amd/vulkan/radv_meta_decompress.c @@ -33,6 +33,12 @@ enum radv_depth_op { DEPTH_RESUMMARIZE, }; +enum radv_depth_decompress { + DECOMPRESS_DEPTH_STENCIL, + DECOMPRESS_DEPTH, + DECOMPRESS_STENCIL, +}; + static VkResult create_pass(struct radv_device *device, uint32_t samples, @@ -104,6 +110,7 @@ create_pipeline(struct radv_device *device, VkRenderPass pass, VkPipelineLayout layout, enum radv_depth_op op, + enum radv_depth_decompress decompress, VkPipeline *pipeline) { VkResult result; @@ -214,8 +221,10 @@ create_pipeline(struct radv_device *device, struct radv_graphics_pipeline_create_info extra = { .use_rectlist = true, - .db_flush_depth_inplace = true, - .db_flush_stencil_inplace = true, + .db_flush_depth_inplace = decompress == DECOMPRESS_DEPTH_STENCIL || + decompress == DECOMPRESS_DEPTH, + .db_flush_stencil_inplace = decompress == DECOMPRESS_DEPTH_STENCIL || + decompress == DECOMPRESS_STENCIL, .db_resummarize = op == DEPTH_RESUMMARIZE, }; @@ -245,9 +254,12 @@ radv_device_finish_meta_depth_decomp_state(struct radv_device *device) radv_DestroyPipelineLayout(radv_device_to_handle(device), state->depth_decomp[i].p_layout, &state->alloc); - radv_DestroyPipeline(radv_device_to_handle(device), - state->depth_decomp[i].decompress_pipeline, - &state->alloc); + + for (uint32_t j = 0; j < NUM_DEPTH_DECOMPRESS_PIPELINES; j++) { + radv_DestroyPipeline(radv_device_to_handle(device), + state->depth_decomp[i].decompress_pipeline[j], + &state->alloc); + } radv_DestroyPipeline(radv_device_to_handle(device), state->depth_decomp[i].resummarize_pipeline, &state->alloc); @@ -284,18 +296,22 @@ radv_device_init_meta_depth_decomp_state(struct radv_device *device, bool on_dem if (on_demand) continue; - res = create_pipeline(device, vs_module_h, samples, - state->depth_decomp[i].pass, - state->depth_decomp[i].p_layout, - DEPTH_DECOMPRESS, - &state->depth_decomp[i].decompress_pipeline); - if (res != VK_SUCCESS) - goto fail; + for (uint32_t j = 0; j < NUM_DEPTH_DECOMPRESS_PIPELINES; j++) { + res = create_pipeline(device, vs_module_h, samples, + state->depth_decomp[i].pass, + state->depth_decomp[i].p_layout, + DEPTH_DECOMPRESS, + j, + &state->depth_decomp[i].decompress_pipeline[j]); + if (res != VK_SUCCESS) + goto fail; + } res = create_pipeline(device, vs_module_h, samples, state->depth_decomp[i].pass, state->depth_decomp[i].p_layout, DEPTH_RESUMMARIZE, + 0, /* unused */ &state->depth_decomp[i].resummarize_pipeline); if (res != VK_SUCCESS) goto fail; @@ -321,23 +337,27 @@ radv_get_depth_pipeline(struct radv_cmd_buffer *cmd_buffer, uint32_t samples_log2 = ffs(samples) - 1; VkPipeline *pipeline; - if (!state->depth_decomp[samples_log2].decompress_pipeline) { + if (!state->depth_decomp[samples_log2].decompress_pipeline[DECOMPRESS_DEPTH_STENCIL]) { VkResult ret; - ret = create_pipeline(cmd_buffer->device, VK_NULL_HANDLE, samples, - state->depth_decomp[samples_log2].pass, - state->depth_decomp[samples_log2].p_layout, - DEPTH_DECOMPRESS, - &state->depth_decomp[samples_log2].decompress_pipeline); - if (ret != VK_SUCCESS) { - cmd_buffer->record_result = ret; - return NULL; + for (uint32_t i = 0; i < NUM_DEPTH_DECOMPRESS_PIPELINES; i++) { + ret = create_pipeline(cmd_buffer->device, VK_NULL_HANDLE, samples, + state->depth_decomp[samples_log2].pass, + state->depth_decomp[samples_log2].p_layout, + DEPTH_DECOMPRESS, + i, + &state->depth_decomp[samples_log2].decompress_pipeline[i]); + if (ret != VK_SUCCESS) { + cmd_buffer->record_result = ret; + return NULL; + } } ret = create_pipeline(cmd_buffer->device, VK_NULL_HANDLE, samples, state->depth_decomp[samples_log2].pass, state->depth_decomp[samples_log2].p_layout, DEPTH_RESUMMARIZE, + 0, /* unused */ &state->depth_decomp[samples_log2].resummarize_pipeline); if (ret != VK_SUCCESS) { cmd_buffer->record_result = ret; @@ -347,7 +367,7 @@ radv_get_depth_pipeline(struct radv_cmd_buffer *cmd_buffer, switch (op) { case DEPTH_DECOMPRESS: - pipeline = &state->depth_decomp[samples_log2].decompress_pipeline; + pipeline = &state->depth_decomp[samples_log2].decompress_pipeline[DECOMPRESS_DEPTH_STENCIL]; break; case DEPTH_RESUMMARIZE: pipeline = &state->depth_decomp[samples_log2].resummarize_pipeline; diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 5d63f4145f2..1e15de10924 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -653,7 +653,7 @@ struct radv_meta_state { struct { VkPipelineLayout p_layout; - VkPipeline decompress_pipeline; + VkPipeline decompress_pipeline[NUM_DEPTH_DECOMPRESS_PIPELINES]; VkPipeline resummarize_pipeline; VkRenderPass pass; } depth_decomp[MAX_SAMPLES_LOG2];