From: Dave Airlie <airl...@redhat.com>

No idea if this is needed or not, just thought I'd write it while
I was here.

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 src/amd/vulkan/radv_meta_fast_clear.c | 53 +++++++++++++++++++++++++++++++++--
 1 file changed, 50 insertions(+), 3 deletions(-)

diff --git a/src/amd/vulkan/radv_meta_fast_clear.c 
b/src/amd/vulkan/radv_meta_fast_clear.c
index 950b438..ea041f4 100644
--- a/src/amd/vulkan/radv_meta_fast_clear.c
+++ b/src/amd/vulkan/radv_meta_fast_clear.c
@@ -277,8 +277,47 @@ create_pipeline(struct radv_device *device,
                                               
&device->meta_state.fast_clear_flush.fmask_decompress_pipeline);
        if (result != VK_SUCCESS)
                goto cleanup_cmask;
+       result = radv_graphics_pipeline_create(device_h,
+                                              
radv_pipeline_cache_to_handle(&device->meta_state.cache),
+                                              &(VkGraphicsPipelineCreateInfo) {
+                                                      .sType = 
VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
+                                                      .stageCount = 2,
+                                                      .pStages = stages,
+
+                                                      .pVertexInputState = 
&vi_state,
+                                                      .pInputAssemblyState = 
&ia_state,
+
+                                              .pViewportState = 
&(VkPipelineViewportStateCreateInfo) {
+                                                      .sType = 
VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
+                                                      .viewportCount = 0,
+                                                      .scissorCount = 0,
+                                              },
+                                                      .pRasterizationState = 
&rs_state,
+                                              .pMultisampleState = 
&(VkPipelineMultisampleStateCreateInfo) {
+                                                      .sType = 
VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
+                                                      .rasterizationSamples = 
1,
+                                                      .sampleShadingEnable = 
false,
+                                                      .pSampleMask = NULL,
+                                                      .alphaToCoverageEnable = 
false,
+                                                      .alphaToOneEnable = 
false,
+                                              },
+                                               .pColorBlendState = 
&blend_state,
+                                               .pDynamicState = NULL,
+                                               .renderPass = 
device->meta_state.fast_clear_flush.pass,
+                                               .subpass = 0,
+                                              },
+                                              &(struct 
radv_graphics_pipeline_create_info) {
+                                                      .use_rectlist = true,
+                                                      .custom_blend_mode = 
V_028808_CB_DCC_DECOMPRESS,
+                                              },
+                                              &device->meta_state.alloc,
+                                              
&device->meta_state.fast_clear_flush.dcc_decompress_pipeline);
+       if (result != VK_SUCCESS)
+               goto cleanup_fmask;
 
        goto cleanup;
+ cleanup_fmask:
+       radv_DestroyPipeline(device_h, 
device->meta_state.fast_clear_flush.fmask_decompress_pipeline, 
&device->meta_state.alloc);
 cleanup_cmask:
        radv_DestroyPipeline(device_h, 
device->meta_state.fast_clear_flush.cmask_eliminate_pipeline, 
&device->meta_state.alloc);
 cleanup:
@@ -307,6 +346,11 @@ radv_device_finish_meta_fast_clear_flush_state(struct 
radv_device *device)
        if (pipeline_h) {
                radv_DestroyPipeline(device_h, pipeline_h, alloc);
        }
+
+       pipeline_h = state->fast_clear_flush.dcc_decompress_pipeline;
+       if (pipeline_h) {
+               radv_DestroyPipeline(device_h, pipeline_h, alloc);
+       }
 }
 
 VkResult
@@ -346,7 +390,8 @@ cleanup:
 static void
 emit_fast_clear_flush(struct radv_cmd_buffer *cmd_buffer,
                      const VkExtent2D *resolve_extent,
-                     bool fmask_decompress)
+                     bool fmask_decompress,
+                     bool dcc_decompress)
 {
        struct radv_device *device = cmd_buffer->device;
        VkCommandBuffer cmd_buffer_h = radv_cmd_buffer_to_handle(cmd_buffer);
@@ -391,7 +436,9 @@ emit_fast_clear_flush(struct radv_cmd_buffer *cmd_buffer,
                                  (VkDeviceSize[]) { 0 });
 
        VkPipeline pipeline_h;
-       if (fmask_decompress)
+       if (dcc_decompress)
+               pipeline_h = 
device->meta_state.fast_clear_flush.dcc_decompress_pipeline;
+       else if (fmask_decompress)
                pipeline_h = 
device->meta_state.fast_clear_flush.fmask_decompress_pipeline;
        else
                pipeline_h = 
device->meta_state.fast_clear_flush.cmask_eliminate_pipeline;
@@ -476,7 +523,7 @@ radv_fast_clear_flush_image_inplace(struct radv_cmd_buffer 
*cmd_buffer,
 
        emit_fast_clear_flush(cmd_buffer,
                              &(VkExtent2D) { image->extent.width, 
image->extent.height },
-                             image->fmask.size > 0);
+                             image->fmask.size > 0, image->surface.dcc_size > 
0);
        radv_CmdEndRenderPass(cmd_buffer_h);
 
        radv_DestroyFramebuffer(device_h, fb_h,
-- 
2.9.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to