diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 1f3d171c9fe..5cd5a70c5ff 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -445,7 +445,8 @@ job_compute_frame_tiling(struct v3dv_job *job, uint32_t height, uint32_t layers, uint32_t render_target_count, - uint8_t max_internal_bpp) + uint8_t max_internal_bpp, + bool msaa) { static const uint8_t tile_sizes[] = { 64, 64, @@ -462,16 +463,18 @@ job_compute_frame_tiling(struct v3dv_job *job, tiling->height = height; tiling->layers = layers; tiling->render_target_count = render_target_count; + tiling->msaa = msaa; uint32_t tile_size_index = 0; - /* FIXME: MSAA */ - if (render_target_count > 2) tile_size_index += 2; else if (render_target_count > 1) tile_size_index += 1; + if (msaa) + tile_size_index += 2; + tiling->internal_bpp = max_internal_bpp; tile_size_index += tiling->internal_bpp; assert(tile_size_index < ARRAY_SIZE(tile_sizes)); @@ -511,7 +514,8 @@ v3dv_job_start_frame(struct v3dv_job *job, uint32_t height, uint32_t layers, uint32_t render_target_count, - uint8_t max_internal_bpp) + uint8_t max_internal_bpp, + bool msaa) { assert(job); @@ -519,7 +523,7 @@ v3dv_job_start_frame(struct v3dv_job *job, const struct v3dv_frame_tiling *tiling = job_compute_frame_tiling(job, width, height, layers, - render_target_count, max_internal_bpp); + render_target_count, max_internal_bpp, msaa); v3dv_cl_ensure_space_with_branch(&job->bcl, 256); v3dv_return_if_oom(NULL, job); @@ -2115,15 +2119,18 @@ cmd_buffer_subpass_create_job(struct v3dv_cmd_buffer *cmd_buffer, const struct v3dv_framebuffer *framebuffer = state->framebuffer; - const uint8_t internal_bpp = - v3dv_framebuffer_compute_internal_bpp(framebuffer, subpass); + uint8_t internal_bpp; + bool msaa; + v3dv_framebuffer_compute_internal_bpp_msaa(framebuffer, subpass, + &internal_bpp, &msaa); v3dv_job_start_frame(job, framebuffer->width, framebuffer->height, framebuffer->layers, subpass->color_count, - internal_bpp); + internal_bpp, + msaa); /* FIXME: we don't suppport resolve attachments yet */ assert(subpass->resolve_attachments == NULL); diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 7e819c5ca27..0494303085e 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -1917,15 +1917,20 @@ v3dv_DestroyBuffer(VkDevice _device, /** * This computes the maximum bpp used by any of the render targets used by - * a particular subpass. If we don't have a subpass (when we are not inside a + * a particular subpass and checks if any of those render targets are + * multisampled. If we don't have a subpass (when we are not inside a * render pass), then we assume that all framebuffer attachments are used. */ -uint8_t -v3dv_framebuffer_compute_internal_bpp(const struct v3dv_framebuffer *framebuffer, - const struct v3dv_subpass *subpass) +void +v3dv_framebuffer_compute_internal_bpp_msaa( + const struct v3dv_framebuffer *framebuffer, + const struct v3dv_subpass *subpass, + uint8_t *max_bpp, + bool *msaa) { STATIC_ASSERT(RENDER_TARGET_MAXIMUM_32BPP == 0); - uint8_t max_bpp = RENDER_TARGET_MAXIMUM_32BPP; + *max_bpp = RENDER_TARGET_MAXIMUM_32BPP; + *msaa = false; if (subpass) { for (uint32_t i = 0; i < subpass->color_count; i++) { @@ -1937,10 +1942,22 @@ v3dv_framebuffer_compute_internal_bpp(const struct v3dv_framebuffer *framebuffer assert(att); if (att->aspects & VK_IMAGE_ASPECT_COLOR_BIT) - max_bpp = MAX2(max_bpp, att->internal_bpp); + *max_bpp = MAX2(*max_bpp, att->internal_bpp); + + if (att->image->samples > VK_SAMPLE_COUNT_1_BIT) + *msaa = true; } - return max_bpp; + if (!*msaa && subpass->ds_attachment.attachment != VK_ATTACHMENT_UNUSED) { + const struct v3dv_image_view *att = + framebuffer->attachments[subpass->ds_attachment.attachment]; + assert(att); + + if (att->image->samples > VK_SAMPLE_COUNT_1_BIT) + *msaa = true; + } + + return; } assert(framebuffer->attachment_count <= 4); @@ -1949,10 +1966,13 @@ v3dv_framebuffer_compute_internal_bpp(const struct v3dv_framebuffer *framebuffer assert(att); if (att->aspects & VK_IMAGE_ASPECT_COLOR_BIT) - max_bpp = MAX2(max_bpp, att->internal_bpp); + *max_bpp = MAX2(*max_bpp, att->internal_bpp); + + if (att->image->samples > VK_SAMPLE_COUNT_1_BIT) + *msaa = true; } - return max_bpp; + return; } VkResult diff --git a/src/broadcom/vulkan/v3dv_image.c b/src/broadcom/vulkan/v3dv_image.c index 6bf6405fe18..fb2da0d4ec8 100644 --- a/src/broadcom/vulkan/v3dv_image.c +++ b/src/broadcom/vulkan/v3dv_image.c @@ -114,7 +114,9 @@ v3d_setup_slices(struct v3dv_image *image) uint32_t block_width = vk_format_get_blockwidth(image->vk_format); uint32_t block_height = vk_format_get_blockheight(image->vk_format); - bool msaa = image->samples > VK_SAMPLE_COUNT_1_BIT; + assert(image->samples == VK_SAMPLE_COUNT_1_BIT || + image->samples == VK_SAMPLE_COUNT_4_BIT); + bool msaa = image->samples != VK_SAMPLE_COUNT_1_BIT; bool uif_top = msaa; @@ -328,6 +330,9 @@ v3dv_CreateImage(VkDevice _device, if (!image) return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); + assert(pCreateInfo->samples == VK_SAMPLE_COUNT_1_BIT || + pCreateInfo->samples == VK_SAMPLE_COUNT_4_BIT); + image->type = pCreateInfo->imageType; image->extent = pCreateInfo->extent; image->vk_format = pCreateInfo->format; diff --git a/src/broadcom/vulkan/v3dv_meta_clear.c b/src/broadcom/vulkan/v3dv_meta_clear.c index 9a7020f2617..07d2a20070e 100644 --- a/src/broadcom/vulkan/v3dv_meta_clear.c +++ b/src/broadcom/vulkan/v3dv_meta_clear.c @@ -1300,15 +1300,17 @@ emit_tlb_clear_job(struct v3dv_cmd_buffer *cmd_buffer, } } - const uint8_t internal_bpp = - v3dv_framebuffer_compute_internal_bpp(framebuffer, subpass); + uint8_t internal_bpp; + bool msaa; + v3dv_framebuffer_compute_internal_bpp_msaa(framebuffer, subpass, + &internal_bpp, &msaa); v3dv_job_start_frame(job, framebuffer->width, framebuffer->height, framebuffer->layers, color_attachment_count, - internal_bpp); + internal_bpp, msaa); struct v3dv_cl *rcl = &job->rcl; v3dv_cl_ensure_space_with_branch(rcl, 200 + diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c index 3f1f15bdbe3..c930669b597 100644 --- a/src/broadcom/vulkan/v3dv_meta_copy.c +++ b/src/broadcom/vulkan/v3dv_meta_copy.c @@ -691,7 +691,7 @@ copy_image_to_buffer_tlb(struct v3dv_cmd_buffer *cmd_buffer, const uint32_t width = DIV_ROUND_UP(region->imageExtent.width, block_w); const uint32_t height = DIV_ROUND_UP(region->imageExtent.height, block_h); - v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp); + v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp, false); struct framebuffer_data framebuffer; setup_framebuffer_data(&framebuffer, fb_format, internal_type, @@ -1185,7 +1185,7 @@ copy_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, const uint32_t width = DIV_ROUND_UP(region->extent.width, block_w); const uint32_t height = DIV_ROUND_UP(region->extent.height, block_h); - v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp); + v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp, false); struct framebuffer_data framebuffer; setup_framebuffer_data(&framebuffer, fb_format, internal_type, @@ -1501,7 +1501,7 @@ clear_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, return true; /* We start a a new job for each layer so the frame "depth" is 1 */ - v3dv_job_start_frame(job, width, height, 1, 1, internal_bpp); + v3dv_job_start_frame(job, width, height, 1, 1, internal_bpp, false); struct framebuffer_data framebuffer; setup_framebuffer_data(&framebuffer, fb_format, internal_type, @@ -1728,7 +1728,7 @@ copy_buffer(struct v3dv_cmd_buffer *cmd_buffer, uint32_t width, height; framebuffer_size_for_pixel_count(num_items, &width, &height); - v3dv_job_start_frame(job, width, height, 1, 1, internal_bpp); + v3dv_job_start_frame(job, width, height, 1, 1, internal_bpp, false); struct framebuffer_data framebuffer; setup_framebuffer_data(&framebuffer, vk_format, internal_type, @@ -1917,7 +1917,7 @@ fill_buffer(struct v3dv_cmd_buffer *cmd_buffer, uint32_t width, height; framebuffer_size_for_pixel_count(num_items, &width, &height); - v3dv_job_start_frame(job, width, height, 1, 1, internal_bpp); + v3dv_job_start_frame(job, width, height, 1, 1, internal_bpp, false); struct framebuffer_data framebuffer; setup_framebuffer_data(&framebuffer, VK_FORMAT_R8G8B8A8_UINT, @@ -2270,7 +2270,7 @@ copy_buffer_to_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, const uint32_t width = DIV_ROUND_UP(region->imageExtent.width, block_w); const uint32_t height = DIV_ROUND_UP(region->imageExtent.height, block_h); - v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp); + v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp, false); struct framebuffer_data framebuffer; setup_framebuffer_data(&framebuffer, fb_format, internal_type, diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 4b4f3daf3eb..e0d74404a6c 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -559,9 +559,10 @@ struct v3dv_framebuffer { struct v3dv_frame_tiling { uint32_t width; uint32_t height; + uint32_t layers; uint32_t render_target_count; uint32_t internal_bpp; - uint32_t layers; + bool msaa; uint32_t tile_width; uint32_t tile_height; uint32_t draw_tiles_x; @@ -572,8 +573,9 @@ struct v3dv_frame_tiling { uint32_t frame_height_in_supertiles; }; -uint8_t v3dv_framebuffer_compute_internal_bpp(const struct v3dv_framebuffer *framebuffer, - const struct v3dv_subpass *subpass); +void v3dv_framebuffer_compute_internal_bpp_msaa(const struct v3dv_framebuffer *framebuffer, + const struct v3dv_subpass *subpass, + uint8_t *max_bpp, bool *msaa); struct v3dv_cmd_pool { VkAllocationCallbacks alloc; @@ -880,7 +882,8 @@ void v3dv_job_start_frame(struct v3dv_job *job, uint32_t height, uint32_t layers, uint32_t render_target_count, - uint8_t max_internal_bpp); + uint8_t max_internal_bpp, + bool msaa); struct v3dv_job *v3dv_cmd_buffer_create_cpu_job(struct v3dv_device *device, enum v3dv_job_type type, struct v3dv_cmd_buffer *cmd_buffer, diff --git a/src/broadcom/vulkan/v3dv_queue.c b/src/broadcom/vulkan/v3dv_queue.c index a5a7164db10..895493f98fb 100644 --- a/src/broadcom/vulkan/v3dv_queue.c +++ b/src/broadcom/vulkan/v3dv_queue.c @@ -713,7 +713,7 @@ queue_submit_job(struct v3dv_queue *queue, static void emit_noop_bin(struct v3dv_job *job) { - v3dv_job_start_frame(job, 1, 1, 1, 1, V3D_INTERNAL_BPP_32); + v3dv_job_start_frame(job, 1, 1, 1, 1, V3D_INTERNAL_BPP_32, false); v3dv_job_emit_binning_flush(job); }