Mesa (master): turnip: implement variableMultisampleRate
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Apr 7 12:59:27 UTC 2021
Module: Mesa
Branch: master
Commit: 519eb735a3085d30042201bbb9a637d0b8796a7a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=519eb735a3085d30042201bbb9a637d0b8796a7a
Author: Danylo Piliaiev <dpiliaiev at igalia.com>
Date: Thu Mar 11 16:22:38 2021 +0200
turnip: implement variableMultisampleRate
If subpass doesn't have depth/color attachments - samples count is
devised from VkPipelineMultisampleStateCreateInfo::rasterizationSamples.
Without variableMultisampleRate enabled all pipelines in such subpass
should have the same samples count; variableMultisampleRate allows
to have pipelines with different number of samples in one subpass,
given that it doesn't have depth/color attachments.
Blob doesn't have it enabled but there is no known reason for this.
Passes:
dEQP-VK.pipeline.multisample.variable_rate.*
Fixes test:
dEQP-VK.pipeline.framebuffer_attachment.no_attachments_ms
Signed-off-by: Danylo Piliaiev <dpiliaiev at igalia.com>
Reviewed-by: Hyunjun Ko <zzoon at igalia.com>
Reviewed-by: Eric Anholt <eric at anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9556>
---
src/freedreno/vulkan/tu_cmd_buffer.c | 6 ++++--
src/freedreno/vulkan/tu_device.c | 2 +-
src/freedreno/vulkan/tu_pass.c | 2 --
src/freedreno/vulkan/tu_pipeline.c | 13 ++++++++++++-
4 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c
index 0de7c7dfd33..26391605f23 100644
--- a/src/freedreno/vulkan/tu_cmd_buffer.c
+++ b/src/freedreno/vulkan/tu_cmd_buffer.c
@@ -2964,7 +2964,8 @@ tu_CmdBeginRenderPass2(VkCommandBuffer commandBuffer,
tu6_emit_zs(cmd, cmd->state.subpass, &cmd->draw_cs);
tu6_emit_mrt(cmd, cmd->state.subpass, &cmd->draw_cs);
- tu6_emit_msaa(&cmd->draw_cs, cmd->state.subpass->samples);
+ if (cmd->state.subpass->samples)
+ tu6_emit_msaa(&cmd->draw_cs, cmd->state.subpass->samples);
tu6_emit_render_cntl(cmd, cmd->state.subpass, &cmd->draw_cs, false);
tu_set_input_attachments(cmd, cmd->state.subpass);
@@ -3029,7 +3030,8 @@ tu_CmdNextSubpass2(VkCommandBuffer commandBuffer,
/* emit mrt/zs/msaa/ubwc state for the subpass that is starting */
tu6_emit_zs(cmd, cmd->state.subpass, cs);
tu6_emit_mrt(cmd, cmd->state.subpass, cs);
- tu6_emit_msaa(cs, cmd->state.subpass->samples);
+ if (cmd->state.subpass->samples)
+ tu6_emit_msaa(cs, cmd->state.subpass->samples);
tu6_emit_render_cntl(cmd, cmd->state.subpass, cs, false);
tu_set_input_attachments(cmd, cmd->state.subpass);
diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c
index 5fe163be27d..04e74982af2 100644
--- a/src/freedreno/vulkan/tu_device.c
+++ b/src/freedreno/vulkan/tu_device.c
@@ -386,7 +386,7 @@ tu_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
.shaderInt64 = false,
.shaderInt16 = false,
.sparseBinding = false,
- .variableMultisampleRate = false,
+ .variableMultisampleRate = true,
.inheritedQueries = true,
};
diff --git a/src/freedreno/vulkan/tu_pass.c b/src/freedreno/vulkan/tu_pass.c
index 0bbc089c536..e63ee0c33a9 100644
--- a/src/freedreno/vulkan/tu_pass.c
+++ b/src/freedreno/vulkan/tu_pass.c
@@ -630,8 +630,6 @@ tu_CreateRenderPass2(VkDevice _device,
pass->attachments[a].gmem_offset = 0;
update_samples(subpass, pCreateInfo->pAttachments[a].samples);
}
-
- subpass->samples = subpass->samples ?: 1;
}
/* disable unused attachments */
diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c
index d0d5b5ca6b5..78a568172cb 100644
--- a/src/freedreno/vulkan/tu_pipeline.c
+++ b/src/freedreno/vulkan/tu_pipeline.c
@@ -259,6 +259,7 @@ struct tu_pipeline_builder
bool rasterizer_discard;
/* these states are affectd by rasterizer_discard */
+ bool emit_msaa_state;
VkSampleCountFlagBits samples;
bool use_color_attachments;
bool use_dual_src_blend;
@@ -2559,7 +2560,8 @@ tu_pipeline_builder_parse_rasterization(struct tu_pipeline_builder *builder,
depth_clip_disable = !depth_clip_state->depthClipEnable;
struct tu_cs cs;
- pipeline->rast_state = tu_cs_draw_state(&pipeline->cs, &cs, 13);
+ uint32_t cs_size = 13 + (builder->emit_msaa_state ? 11 : 0);
+ pipeline->rast_state = tu_cs_draw_state(&pipeline->cs, &cs, cs_size);
tu_cs_emit_regs(&cs,
A6XX_GRAS_CL_CNTL(
@@ -2591,6 +2593,12 @@ tu_pipeline_builder_parse_rasterization(struct tu_pipeline_builder *builder,
tu_cs_emit_regs(&cs,
A6XX_VPC_UNKNOWN_9107(.raster_discard = rast_info->rasterizerDiscardEnable));
+ /* If samples count couldn't be devised from the subpass, we should emit it here.
+ * It happens when subpass doesn't use any color/depth attachment.
+ */
+ if (builder->emit_msaa_state)
+ tu6_emit_msaa(&cs, builder->samples);
+
pipeline->gras_su_cntl =
tu6_gras_su_cntl(rast_info, builder->samples, builder->multiview_mask != 0);
@@ -2969,6 +2977,9 @@ tu_pipeline_builder_init_graphics(
builder->rasterizer_discard =
create_info->pRasterizationState->rasterizerDiscardEnable;
+ /* variableMultisampleRate support */
+ builder->emit_msaa_state = (subpass->samples == 0) && !builder->rasterizer_discard;
+
if (builder->rasterizer_discard) {
builder->samples = VK_SAMPLE_COUNT_1_BIT;
} else {
More information about the mesa-commit
mailing list