From 30bc562bdaec2efbfae4cc01548b2adbae2c0c4b Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 16 Apr 2021 11:08:46 +0300 Subject: [PATCH] anv: fix 3DSTATE_MULTISAMPLE emission on gen8+ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When pipeline->dynamic_state.sample_locations.samples is not set because the state is dynamic, we're currently calling genX(emit_multisample) with a 0 samples value which is incorrect. Found when using renderdoc with the drawing overlay. Signed-off-by: Lionel Landwerlin Fixes: 4ad4cd89069bfc ("anv: Enabled the VK_EXT_sample_locations extension") Cc: Reviewed-by: Tapani Pälli Part-of: --- src/intel/vulkan/anv_pipeline.c | 26 ++++++++++++++------------ src/intel/vulkan/genX_pipeline.c | 16 ++++++++-------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index a598d3c15a0..a8b30274c91 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -2049,9 +2049,9 @@ copy_non_dynamic_state(struct anv_graphics_pipeline *pipeline, } } + const VkPipelineMultisampleStateCreateInfo *ms_info = + pCreateInfo->pMultisampleState; if (states & ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS) { - const VkPipelineMultisampleStateCreateInfo *ms_info = - pCreateInfo->pMultisampleState; const VkPipelineSampleLocationsStateCreateInfoEXT *sl_info = ms_info ? vk_find_struct_const(ms_info, PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT) : NULL; @@ -2064,16 +2064,18 @@ copy_non_dynamic_state(struct anv_graphics_pipeline *pipeline, dynamic->sample_locations.locations[i].x = positions[i].x; dynamic->sample_locations.locations[i].y = positions[i].y; } - - } else { - dynamic->sample_locations.samples = - ms_info ? ms_info->rasterizationSamples : 1; - const struct intel_sample_position *positions = - intel_get_sample_positions(dynamic->sample_locations.samples); - for (uint32_t i = 0; i < dynamic->sample_locations.samples; i++) { - dynamic->sample_locations.locations[i].x = positions[i].x; - dynamic->sample_locations.locations[i].y = positions[i].y; - } + } + } + /* Ensure we always have valid values for sample_locations. */ + if (pipeline->base.device->vk.enabled_extensions.EXT_sample_locations && + dynamic->sample_locations.samples == 0) { + dynamic->sample_locations.samples = + ms_info ? ms_info->rasterizationSamples : 1; + const struct intel_sample_position *positions = + intel_get_sample_positions(dynamic->sample_locations.samples); + for (uint32_t i = 0; i < dynamic->sample_locations.samples; i++) { + dynamic->sample_locations.locations[i].x = positions[i].x; + dynamic->sample_locations.locations[i].y = positions[i].y; } } diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c index 32594192134..8e3aeef9ff2 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -755,16 +755,16 @@ emit_ms_state(struct anv_graphics_pipeline *pipeline, const VkPipelineMultisampleStateCreateInfo *info, uint32_t dynamic_states) { - /* If the sample locations are dynamic, 3DSTATE_MULTISAMPLE on Gfx7/7.5 - * will be emitted dynamically, so skip it here. On Gfx8+ - * 3DSTATE_SAMPLE_PATTERN will be emitted dynamically, so skip it here. + /* Only lookup locations if the extensions is active, otherwise the default + * ones will be used either at device initialization time or through + * 3DSTATE_MULTISAMPLE on Gfx7/7.5 by passing NULL locations. */ - if (!(dynamic_states & ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS)) { - /* Only lookup locations if the extensions is active, otherwise the - * default ones will be used either at device initialization time or - * through 3DSTATE_MULTISAMPLE on Gfx7/7.5 by passing NULL locations. + if (pipeline->base.device->vk.enabled_extensions.EXT_sample_locations) { + /* If the sample locations are dynamic, 3DSTATE_MULTISAMPLE on Gfx7/7.5 + * will be emitted dynamically, so skip it here. On Gfx8+ + * 3DSTATE_SAMPLE_PATTERN will be emitted dynamically, so skip it here. */ - if (pipeline->base.device->vk.enabled_extensions.EXT_sample_locations) { + if (!(dynamic_states & ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS)) { #if GFX_VER >= 8 genX(emit_sample_pattern)(&pipeline->base.batch, pipeline->dynamic_state.sample_locations.samples,