radv: Store image view also outside framebuffer.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Fri, 2 Aug 2019 13:22:37 +0000 (15:22 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Fri, 2 Aug 2019 20:19:16 +0000 (22:19 +0200)
So we can use it with imageless framebuffers.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/amd/vulkan/radv_cmd_buffer.c
src/amd/vulkan/radv_meta_clear.c
src/amd/vulkan/radv_meta_resolve.c
src/amd/vulkan/radv_meta_resolve_cs.c
src/amd/vulkan/radv_meta_resolve_fs.c
src/amd/vulkan/radv_private.h

index cd31cead287df4cfbde48aff4bd0df7dda2481f3..e46c3ee9c4724255133a0033bbabc52343ff64ac 100644 (file)
@@ -1528,19 +1528,18 @@ radv_update_bound_fast_clear_ds(struct radv_cmd_buffer *cmd_buffer,
                                VkClearDepthStencilValue ds_clear_value,
                                VkImageAspectFlags aspects)
 {
-       struct radv_framebuffer *framebuffer = cmd_buffer->state.framebuffer;
        const struct radv_subpass *subpass = cmd_buffer->state.subpass;
        struct radeon_cmdbuf *cs = cmd_buffer->cs;
        uint32_t att_idx;
 
-       if (!framebuffer || !subpass)
+       if (!cmd_buffer->state.attachments || !subpass)
                return;
 
        if (!subpass->depth_stencil_attachment)
                return;
 
        att_idx = subpass->depth_stencil_attachment->attachment;
-       if (framebuffer->attachments[att_idx]->image != image)
+       if (cmd_buffer->state.attachments[att_idx].iview->image != image)
                return;
 
        radeon_set_context_reg_seq(cs, R_028028_DB_STENCIL_CLEAR, 2);
@@ -1776,19 +1775,18 @@ radv_update_bound_fast_clear_color(struct radv_cmd_buffer *cmd_buffer,
                                   int cb_idx,
                                   uint32_t color_values[2])
 {
-       struct radv_framebuffer *framebuffer = cmd_buffer->state.framebuffer;
        const struct radv_subpass *subpass = cmd_buffer->state.subpass;
        struct radeon_cmdbuf *cs = cmd_buffer->cs;
        uint32_t att_idx;
 
-       if (!framebuffer || !subpass)
+       if (!cmd_buffer->state.attachments || !subpass)
                return;
 
        att_idx = subpass->color_attachments[cb_idx].attachment;
        if (att_idx == VK_ATTACHMENT_UNUSED)
                return;
 
-       if (framebuffer->attachments[att_idx]->image != image)
+       if (cmd_buffer->state.attachments[att_idx].iview->image != image)
                return;
 
        radeon_set_context_reg_seq(cs, R_028C8C_CB_COLOR0_CLEAR_WORD0 + cb_idx * 0x3c, 2);
@@ -1913,7 +1911,7 @@ radv_emit_framebuffer_state(struct radv_cmd_buffer *cmd_buffer)
                }
 
                int idx = subpass->color_attachments[i].attachment;
-               struct radv_image_view *iview = framebuffer->attachments[idx];
+               struct radv_image_view *iview = cmd_buffer->state.attachments[idx].iview;
                VkImageLayout layout = subpass->color_attachments[i].layout;
 
                radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, iview->bo);
@@ -1928,8 +1926,8 @@ radv_emit_framebuffer_state(struct radv_cmd_buffer *cmd_buffer)
        if (subpass->depth_stencil_attachment) {
                int idx = subpass->depth_stencil_attachment->attachment;
                VkImageLayout layout = subpass->depth_stencil_attachment->layout;
-               struct radv_image *image = framebuffer->attachments[idx]->image;
-               radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, framebuffer->attachments[idx]->bo);
+               struct radv_image *image = cmd_buffer->state.attachments[idx].iview->image;
+               radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, cmd_buffer->state.attachments[idx].iview->bo);
                ASSERTED uint32_t queue_mask = radv_image_queue_family_mask(image,
                                                                                cmd_buffer->queue_family_index,
                                                                                cmd_buffer->queue_family_index);
@@ -2839,7 +2837,7 @@ radv_get_attachment_sample_locations(struct radv_cmd_buffer *cmd_buffer,
 {
        struct radv_cmd_state *state = &cmd_buffer->state;
        uint32_t subpass_id = radv_get_subpass_id(cmd_buffer);
-       struct radv_image_view *view = state->framebuffer->attachments[att_idx];
+       struct radv_image_view *view = state->attachments[att_idx].iview;
 
        if (view->image->info.samples == 1)
                return NULL;
@@ -2878,7 +2876,7 @@ static void radv_handle_subpass_image_transition(struct radv_cmd_buffer *cmd_buf
                                                 bool begin_subpass)
 {
        unsigned idx = att.attachment;
-       struct radv_image_view *view = cmd_buffer->state.framebuffer->attachments[idx];
+       struct radv_image_view *view = cmd_buffer->state.attachments[idx].iview;
        struct radv_sample_locations_state *sample_locs;
        VkImageSubresourceRange range;
        range.aspectMask = 0;
@@ -2932,7 +2930,6 @@ radv_cmd_state_setup_sample_locations(struct radv_cmd_buffer *cmd_buffer,
                vk_find_struct_const(info->pNext,
                                     RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT);
        struct radv_cmd_state *state = &cmd_buffer->state;
-       struct radv_framebuffer *framebuffer = state->framebuffer;
 
        if (!sample_locs) {
                state->subpass_sample_locs = NULL;
@@ -2943,7 +2940,7 @@ radv_cmd_state_setup_sample_locations(struct radv_cmd_buffer *cmd_buffer,
                const VkAttachmentSampleLocationsEXT *att_sample_locs =
                        &sample_locs->pAttachmentInitialSampleLocations[i];
                uint32_t att_idx = att_sample_locs->attachmentIndex;
-               struct radv_image *image = framebuffer->attachments[att_idx]->image;
+               struct radv_image *image = cmd_buffer->state.attachments[att_idx].iview->image;
 
                assert(vk_format_is_depth_or_stencil(image->vk_format));
 
index c2660679b5847d8590995a0f70327f2908ad85bf..37bfab3cbf5ac55b262d219274af5af639790b9a 100644 (file)
@@ -367,10 +367,10 @@ emit_color_clear(struct radv_cmd_buffer *cmd_buffer,
 {
        struct radv_device *device = cmd_buffer->device;
        const struct radv_subpass *subpass = cmd_buffer->state.subpass;
-       const struct radv_framebuffer *fb = cmd_buffer->state.framebuffer;
        const uint32_t subpass_att = clear_att->colorAttachment;
        const uint32_t pass_att = subpass->color_attachments[subpass_att].attachment;
-       const struct radv_image_view *iview = fb ? fb->attachments[pass_att] : NULL;
+       const struct radv_image_view *iview = cmd_buffer->state.attachments ?
+               cmd_buffer->state.attachments[pass_att].iview : NULL;
        uint32_t samples, samples_log2;
        VkFormat format;
        unsigned fs_key;
@@ -721,11 +721,11 @@ emit_depthstencil_clear(struct radv_cmd_buffer *cmd_buffer,
        struct radv_device *device = cmd_buffer->device;
        struct radv_meta_state *meta_state = &device->meta_state;
        const struct radv_subpass *subpass = cmd_buffer->state.subpass;
-       const struct radv_framebuffer *fb = cmd_buffer->state.framebuffer;
        const uint32_t pass_att = ds_att->attachment;
        VkClearDepthStencilValue clear_value = clear_att->clearValue.depthStencil;
        VkImageAspectFlags aspects = clear_att->aspectMask;
-       const struct radv_image_view *iview = fb ? fb->attachments[pass_att] : NULL;
+       const struct radv_image_view *iview = cmd_buffer->state.attachments ?
+               cmd_buffer->state.attachments[pass_att].iview : NULL;
        uint32_t samples, samples_log2;
        VkCommandBuffer cmd_buffer_h = radv_cmd_buffer_to_handle(cmd_buffer);
 
@@ -1679,7 +1679,7 @@ emit_clear(struct radv_cmd_buffer *cmd_buffer,
                        return;
 
                VkImageLayout image_layout = subpass->color_attachments[subpass_att].layout;
-               const struct radv_image_view *iview = fb ? fb->attachments[pass_att] : NULL;
+               const struct radv_image_view *iview = fb ? cmd_buffer->state.attachments[pass_att].iview : NULL;
                VkClearColorValue clear_value = clear_att->clearValue.color;
 
                if (radv_can_fast_clear_color(cmd_buffer, iview, image_layout,
@@ -1700,7 +1700,7 @@ emit_clear(struct radv_cmd_buffer *cmd_buffer,
                        return;
 
                VkImageLayout image_layout = ds_att->layout;
-               const struct radv_image_view *iview = fb ? fb->attachments[ds_att->attachment] : NULL;
+               const struct radv_image_view *iview = fb ? cmd_buffer->state.attachments[ds_att->attachment].iview : NULL;
                VkClearDepthStencilValue clear_value = clear_att->clearValue.depthStencil;
 
                assert(aspects & (VK_IMAGE_ASPECT_DEPTH_BIT |
index 6cad62d440ccabfdb8864177915310c54fde4b1f..e795720fd0b4773a25d333ea59e7eeec7d30cc59 100644 (file)
@@ -641,9 +641,9 @@ radv_cmd_buffer_resolve_subpass(struct radv_cmd_buffer *cmd_buffer)
                struct radv_subpass_attachment src_att = *subpass->depth_stencil_attachment;
                struct radv_subpass_attachment dst_att = *subpass->ds_resolve_attachment;
                struct radv_image_view *src_iview =
-                       cmd_buffer->state.framebuffer->attachments[src_att.attachment];
+                       cmd_buffer->state.attachments[src_att.attachment].iview;
                struct radv_image_view *dst_iview =
-                       cmd_buffer->state.framebuffer->attachments[dst_att.attachment];
+                       cmd_buffer->state.attachments[dst_att.attachment].iview;
 
                radv_pick_resolve_method_images(src_iview->image,
                                                src_iview->vk_format,
@@ -694,8 +694,8 @@ radv_cmd_buffer_resolve_subpass(struct radv_cmd_buffer *cmd_buffer)
                /* Make sure to not clear color attachments after resolves. */
                cmd_buffer->state.attachments[dest_att.attachment].pending_clear_aspects = 0;
 
-               struct radv_image *dst_img = cmd_buffer->state.framebuffer->attachments[dest_att.attachment]->image;
-               struct radv_image_view *src_iview= cmd_buffer->state.framebuffer->attachments[src_att.attachment];
+               struct radv_image *dst_img = cmd_buffer->state.attachments[dest_att.attachment].iview->image;
+               struct radv_image_view *src_iview= cmd_buffer->state.attachments[src_att.attachment].iview;
                struct radv_image *src_img = src_iview->image;
 
                radv_pick_resolve_method_images(src_img, src_iview->vk_format,
@@ -725,7 +725,7 @@ radv_cmd_buffer_resolve_subpass(struct radv_cmd_buffer *cmd_buffer)
                if (dest_att.attachment == VK_ATTACHMENT_UNUSED)
                        continue;
 
-               struct radv_image_view *dest_iview = cmd_buffer->state.framebuffer->attachments[dest_att.attachment];
+               struct radv_image_view *dest_iview = cmd_buffer->state.attachments[dest_att.attachment].iview;
                struct radv_image *dst_img = dest_iview->image;
 
                if (radv_dcc_enabled(dst_img, dest_iview->base_mip)) {
@@ -787,7 +787,7 @@ radv_decompress_resolve_subpass_src(struct radv_cmd_buffer *cmd_buffer)
                if (dest_att.attachment == VK_ATTACHMENT_UNUSED)
                        continue;
 
-               struct radv_image_view *src_iview = fb->attachments[src_att.attachment];
+               struct radv_image_view *src_iview = cmd_buffer->state.attachments[src_att.attachment].iview;
                struct radv_image *src_image = src_iview->image;
 
                VkImageResolve region = {};
index b5d6ae12d0f098c79ec5fb6eb2647457224e627f..ef240a9c06514f46b4ca2ed08dd44e734654213f 100644 (file)
@@ -921,8 +921,8 @@ radv_cmd_buffer_resolve_subpass_cs(struct radv_cmd_buffer *cmd_buffer)
                if (dst_att.attachment == VK_ATTACHMENT_UNUSED)
                        continue;
 
-               struct radv_image_view *src_iview = fb->attachments[src_att.attachment];
-               struct radv_image_view *dst_iview = fb->attachments[dst_att.attachment];
+               struct radv_image_view *src_iview = cmd_buffer->state.attachments[src_att.attachment].iview;
+               struct radv_image_view *dst_iview = cmd_buffer->state.attachments[dst_att.attachment].iview;
 
                VkImageResolve region = {
                        .extent = (VkExtent3D){ fb->width, fb->height, 0 },
@@ -989,9 +989,9 @@ radv_depth_stencil_resolve_subpass_cs(struct radv_cmd_buffer *cmd_buffer,
        struct radv_subpass_attachment dest_att = *subpass->ds_resolve_attachment;
 
        struct radv_image_view *src_iview =
-               cmd_buffer->state.framebuffer->attachments[src_att.attachment];
+               cmd_buffer->state.attachments[src_att.attachment].iview;
        struct radv_image_view *dst_iview =
-               cmd_buffer->state.framebuffer->attachments[dest_att.attachment];
+               cmd_buffer->state.attachments[dest_att.attachment].iview;
 
        struct radv_image *src_image = src_iview->image;
        struct radv_image *dst_image = dst_iview->image;
index 89d074c18a938ddaa1b8d22fc879c5886ee32401..1d6427b73fb1982f1bce0023f7f2021b42aee5e4 100644 (file)
@@ -1146,8 +1146,8 @@ radv_cmd_buffer_resolve_subpass_fs(struct radv_cmd_buffer *cmd_buffer)
                if (dest_att.attachment == VK_ATTACHMENT_UNUSED)
                        continue;
 
-               struct radv_image_view *dest_iview = cmd_buffer->state.framebuffer->attachments[dest_att.attachment];
-               struct radv_image_view *src_iview = cmd_buffer->state.framebuffer->attachments[src_att.attachment];
+               struct radv_image_view *dest_iview = cmd_buffer->state.attachments[dest_att.attachment].iview;
+               struct radv_image_view *src_iview = cmd_buffer->state.attachments[src_att.attachment].iview;
 
                struct radv_subpass resolve_subpass = {
                        .color_count = 1,
@@ -1201,10 +1201,10 @@ radv_depth_stencil_resolve_subpass_fs(struct radv_cmd_buffer *cmd_buffer,
        struct radv_subpass_attachment dst_att = *subpass->ds_resolve_attachment;
 
        struct radv_image_view *src_iview =
-               cmd_buffer->state.framebuffer->attachments[src_att.attachment];
+               cmd_buffer->state.attachments[src_att.attachment].iview;
        struct radv_image *src_image = src_iview->image;
        struct radv_image_view *dst_iview =
-               cmd_buffer->state.framebuffer->attachments[dst_att.attachment];
+               cmd_buffer->state.attachments[dst_att.attachment].iview;
 
        struct radv_subpass resolve_subpass = {
                .color_count = 0,
index a6af335111478949c76dec0d1efefc03d77f897b..c0d30d747f4ef993826d75058e108516f3abad8e 100644 (file)
@@ -1104,6 +1104,7 @@ struct radv_attachment_state {
                struct radv_color_buffer_info cb;
                struct radv_ds_buffer_info ds;
        };
+       struct radv_image_view *iview;
 };
 
 struct radv_descriptor_state {