anv: implement VK_EXT_pipeline_robustness
v2: - Use vk_pipeline_robustness_state Reviewed-by: Ivan Briano <ivan.briano@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17545>
This commit is contained in:
@@ -588,7 +588,7 @@ Khronos extensions that are not part of any Vulkan version:
|
|||||||
VK_EXT_pci_bus_info DONE (anv, hasvk, nvk, radv, vn)
|
VK_EXT_pci_bus_info DONE (anv, hasvk, nvk, radv, vn)
|
||||||
VK_EXT_physical_device_drm DONE (anv, hasvk, nvk, radv, tu, v3dv, vn)
|
VK_EXT_physical_device_drm DONE (anv, hasvk, nvk, radv, tu, v3dv, vn)
|
||||||
VK_EXT_pipeline_library_group_handles DONE (anv, radv)
|
VK_EXT_pipeline_library_group_handles DONE (anv, radv)
|
||||||
VK_EXT_pipeline_robustness DONE (radv, v3dv)
|
VK_EXT_pipeline_robustness DONE (anv, radv, v3dv)
|
||||||
VK_EXT_post_depth_coverage DONE (anv/gfx10+, lvp, radv/gfx10+)
|
VK_EXT_post_depth_coverage DONE (anv/gfx10+, lvp, radv/gfx10+)
|
||||||
VK_EXT_primitive_topology_list_restart DONE (anv, hasvk, lvp, radv, tu, v3dv, vn)
|
VK_EXT_primitive_topology_list_restart DONE (anv, hasvk, lvp, radv, tu, v3dv, vn)
|
||||||
VK_EXT_primitives_generated_query DONE (anv, hasvk, lvp, radv, tu, vn)
|
VK_EXT_primitives_generated_query DONE (anv, hasvk, lvp, radv, tu, vn)
|
||||||
|
@@ -5,3 +5,4 @@ New drivers
|
|||||||
|
|
||||||
New features
|
New features
|
||||||
------------
|
------------
|
||||||
|
VK_EXT_pipeline_robustness on ANV
|
||||||
|
@@ -346,6 +346,7 @@ get_device_extensions(const struct anv_physical_device *device,
|
|||||||
.EXT_pipeline_creation_cache_control = true,
|
.EXT_pipeline_creation_cache_control = true,
|
||||||
.EXT_pipeline_creation_feedback = true,
|
.EXT_pipeline_creation_feedback = true,
|
||||||
.EXT_pipeline_library_group_handles = rt_enabled,
|
.EXT_pipeline_library_group_handles = rt_enabled,
|
||||||
|
.EXT_pipeline_robustness = true,
|
||||||
.EXT_post_depth_coverage = true,
|
.EXT_post_depth_coverage = true,
|
||||||
.EXT_primitives_generated_query = true,
|
.EXT_primitives_generated_query = true,
|
||||||
.EXT_primitive_topology_list_restart = true,
|
.EXT_primitive_topology_list_restart = true,
|
||||||
@@ -829,6 +830,9 @@ get_features(const struct anv_physical_device *pdevice,
|
|||||||
.floatRepresentation = true,
|
.floatRepresentation = true,
|
||||||
.leastRepresentableValueForceUnormRepresentation = false,
|
.leastRepresentableValueForceUnormRepresentation = false,
|
||||||
.depthBiasExact = true,
|
.depthBiasExact = true,
|
||||||
|
|
||||||
|
/* VK_EXT_pipeline_robustness */
|
||||||
|
.pipelineRobustness = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The new DOOM and Wolfenstein games require depthBounds without
|
/* The new DOOM and Wolfenstein games require depthBounds without
|
||||||
@@ -2411,6 +2415,20 @@ void anv_GetPhysicalDeviceProperties2(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT: {
|
||||||
|
VkPhysicalDevicePipelineRobustnessPropertiesEXT *properties =
|
||||||
|
(VkPhysicalDevicePipelineRobustnessPropertiesEXT *)ext;
|
||||||
|
properties->defaultRobustnessStorageBuffers =
|
||||||
|
VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT;
|
||||||
|
properties->defaultRobustnessUniformBuffers =
|
||||||
|
VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT;
|
||||||
|
properties->defaultRobustnessVertexInputs =
|
||||||
|
VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT;
|
||||||
|
properties->defaultRobustnessImages =
|
||||||
|
VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wswitch"
|
#pragma GCC diagnostic ignored "-Wswitch"
|
||||||
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID: {
|
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID: {
|
||||||
|
@@ -2567,9 +2567,14 @@ anv_image_fill_surface_state(struct anv_device *device,
|
|||||||
view_usage),
|
view_usage),
|
||||||
.x_offset_sa = tile_x_sa,
|
.x_offset_sa = tile_x_sa,
|
||||||
.y_offset_sa = tile_y_sa,
|
.y_offset_sa = tile_y_sa,
|
||||||
|
/* Assume robustness with EXT_pipeline_robustness
|
||||||
|
* because this can be turned on/off per pipeline and
|
||||||
|
* we have no visibility on this here.
|
||||||
|
*/
|
||||||
.robust_image_access =
|
.robust_image_access =
|
||||||
device->vk.enabled_features.robustImageAccess ||
|
device->vk.enabled_features.robustImageAccess ||
|
||||||
device->vk.enabled_features.robustImageAccess2);
|
device->vk.enabled_features.robustImageAccess2 ||
|
||||||
|
device->vk.enabled_extensions.EXT_pipeline_robustness);
|
||||||
|
|
||||||
/* With the exception of gfx8, the bottom 12 bits of the MCS base address
|
/* With the exception of gfx8, the bottom 12 bits of the MCS base address
|
||||||
* are used to store other information. This should be ok, however, because
|
* are used to store other information. This should be ok, however, because
|
||||||
|
@@ -382,6 +382,10 @@ struct anv_pipeline_stage {
|
|||||||
|
|
||||||
struct vk_pipeline_robustness_state rstate;
|
struct vk_pipeline_robustness_state rstate;
|
||||||
|
|
||||||
|
/* VkComputePipelineCreateInfo, VkGraphicsPipelineCreateInfo or
|
||||||
|
* VkRayTracingPipelineCreateInfoKHR pNext field
|
||||||
|
*/
|
||||||
|
const void *pipeline_pNext;
|
||||||
const VkPipelineShaderStageCreateInfo *info;
|
const VkPipelineShaderStageCreateInfo *info;
|
||||||
|
|
||||||
unsigned char shader_sha1[20];
|
unsigned char shader_sha1[20];
|
||||||
@@ -687,9 +691,22 @@ populate_bs_prog_key(struct anv_pipeline_stage *stage,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
anv_stage_write_shader_hash(struct anv_pipeline_stage *stage,
|
anv_stage_write_shader_hash(struct anv_pipeline_stage *stage,
|
||||||
const VkPipelineShaderStageCreateInfo *sinfo)
|
const struct anv_device *device)
|
||||||
{
|
{
|
||||||
vk_pipeline_hash_shader_stage(sinfo, NULL, stage->shader_sha1);
|
vk_pipeline_robustness_state_fill(&device->vk,
|
||||||
|
&stage->rstate,
|
||||||
|
stage->pipeline_pNext,
|
||||||
|
stage->info->pNext);
|
||||||
|
|
||||||
|
vk_pipeline_hash_shader_stage(stage->info, &stage->rstate, stage->shader_sha1);
|
||||||
|
|
||||||
|
stage->robust_flags =
|
||||||
|
((stage->rstate.storage_buffers !=
|
||||||
|
VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT) ?
|
||||||
|
BRW_ROBUSTNESS_SSBO : 0) |
|
||||||
|
((stage->rstate.uniform_buffers !=
|
||||||
|
VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT) ?
|
||||||
|
BRW_ROBUSTNESS_UBO : 0);
|
||||||
|
|
||||||
/* Use lowest dword of source shader sha1 for shader hash. */
|
/* Use lowest dword of source shader sha1 for shader hash. */
|
||||||
stage->source_hash = ((uint32_t*)stage->shader_sha1)[0];
|
stage->source_hash = ((uint32_t*)stage->shader_sha1)[0];
|
||||||
@@ -1669,13 +1686,6 @@ anv_graphics_pipeline_skip_shader_compile(struct anv_graphics_base_pipeline *pip
|
|||||||
return stages[stage].info == NULL;
|
return stages[stage].info == NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum brw_robustness_flags
|
|
||||||
anv_device_get_robust_flags(const struct anv_device *device)
|
|
||||||
{
|
|
||||||
return device->robust_buffer_access ?
|
|
||||||
(BRW_ROBUSTNESS_UBO | BRW_ROBUSTNESS_SSBO) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
anv_graphics_pipeline_init_keys(struct anv_graphics_base_pipeline *pipeline,
|
anv_graphics_pipeline_init_keys(struct anv_graphics_base_pipeline *pipeline,
|
||||||
const struct vk_graphics_pipeline_state *state,
|
const struct vk_graphics_pipeline_state *state,
|
||||||
@@ -1984,9 +1994,12 @@ anv_pipeline_nir_preprocess(struct anv_pipeline *pipeline,
|
|||||||
|
|
||||||
struct brw_nir_compiler_opts opts = {
|
struct brw_nir_compiler_opts opts = {
|
||||||
.softfp64 = device->fp64_nir,
|
.softfp64 = device->fp64_nir,
|
||||||
.robust_image_access =
|
/* Assume robustness with EXT_pipeline_robustness because this can be
|
||||||
device->vk.enabled_features.robustImageAccess ||
|
* turned on/off per pipeline and we have no visibility on this here.
|
||||||
device->vk.enabled_features.robustImageAccess2,
|
*/
|
||||||
|
.robust_image_access = device->vk.enabled_features.robustImageAccess ||
|
||||||
|
device->vk.enabled_features.robustImageAccess2 ||
|
||||||
|
device->vk.enabled_extensions.EXT_pipeline_robustness,
|
||||||
.input_vertices = stage->nir->info.stage == MESA_SHADER_TESS_CTRL ?
|
.input_vertices = stage->nir->info.stage == MESA_SHADER_TESS_CTRL ?
|
||||||
stage->key.tcs.input_vertices : 0,
|
stage->key.tcs.input_vertices : 0,
|
||||||
};
|
};
|
||||||
@@ -2081,12 +2094,11 @@ anv_graphics_pipeline_compile(struct anv_graphics_base_pipeline *pipeline,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
stages[stage].stage = stage;
|
stages[stage].stage = stage;
|
||||||
|
stages[stage].pipeline_pNext = info->pNext;
|
||||||
stages[stage].info = &info->pStages[i];
|
stages[stage].info = &info->pStages[i];
|
||||||
stages[stage].feedback_idx = shader_count++;
|
stages[stage].feedback_idx = shader_count++;
|
||||||
|
|
||||||
anv_stage_write_shader_hash(&stages[stage], stages[stage].info);
|
anv_stage_write_shader_hash(&stages[stage], device);
|
||||||
|
|
||||||
stages[stage].robust_flags = anv_device_get_robust_flags(device);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prepare shader keys for all shaders in pipeline->base.active_stages
|
/* Prepare shader keys for all shaders in pipeline->base.active_stages
|
||||||
@@ -2504,6 +2516,7 @@ anv_pipeline_compile_cs(struct anv_compute_pipeline *pipeline,
|
|||||||
struct anv_pipeline_stage stage = {
|
struct anv_pipeline_stage stage = {
|
||||||
.stage = MESA_SHADER_COMPUTE,
|
.stage = MESA_SHADER_COMPUTE,
|
||||||
.info = &info->stage,
|
.info = &info->stage,
|
||||||
|
.pipeline_pNext = info->pNext,
|
||||||
.cache_key = {
|
.cache_key = {
|
||||||
.stage = MESA_SHADER_COMPUTE,
|
.stage = MESA_SHADER_COMPUTE,
|
||||||
},
|
},
|
||||||
@@ -2511,7 +2524,7 @@ anv_pipeline_compile_cs(struct anv_compute_pipeline *pipeline,
|
|||||||
.flags = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT,
|
.flags = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
anv_stage_write_shader_hash(&stage, &info->stage);
|
anv_stage_write_shader_hash(&stage, device);
|
||||||
|
|
||||||
struct anv_shader_bin *bin = NULL;
|
struct anv_shader_bin *bin = NULL;
|
||||||
|
|
||||||
@@ -3416,6 +3429,7 @@ anv_pipeline_init_ray_tracing_stages(struct anv_ray_tracing_pipeline *pipeline,
|
|||||||
const VkRayTracingPipelineCreateInfoKHR *info,
|
const VkRayTracingPipelineCreateInfoKHR *info,
|
||||||
void *pipeline_ctx)
|
void *pipeline_ctx)
|
||||||
{
|
{
|
||||||
|
struct anv_device *device = pipeline->base.device;
|
||||||
/* Create enough stage entries for all shader modules plus potential
|
/* Create enough stage entries for all shader modules plus potential
|
||||||
* combinaisons in the groups.
|
* combinaisons in the groups.
|
||||||
*/
|
*/
|
||||||
@@ -3434,6 +3448,7 @@ anv_pipeline_init_ray_tracing_stages(struct anv_ray_tracing_pipeline *pipeline,
|
|||||||
|
|
||||||
stages[i] = (struct anv_pipeline_stage) {
|
stages[i] = (struct anv_pipeline_stage) {
|
||||||
.stage = vk_to_mesa_shader_stage(sinfo->stage),
|
.stage = vk_to_mesa_shader_stage(sinfo->stage),
|
||||||
|
.pipeline_pNext = info->pNext,
|
||||||
.info = sinfo,
|
.info = sinfo,
|
||||||
.cache_key = {
|
.cache_key = {
|
||||||
.stage = vk_to_mesa_shader_stage(sinfo->stage),
|
.stage = vk_to_mesa_shader_stage(sinfo->stage),
|
||||||
@@ -3445,7 +3460,7 @@ anv_pipeline_init_ray_tracing_stages(struct anv_ray_tracing_pipeline *pipeline,
|
|||||||
|
|
||||||
pipeline->base.active_stages |= sinfo->stage;
|
pipeline->base.active_stages |= sinfo->stage;
|
||||||
|
|
||||||
anv_stage_write_shader_hash(&stages[i], sinfo);
|
anv_stage_write_shader_hash(&stages[i], device);
|
||||||
|
|
||||||
populate_bs_prog_key(&stages[i],
|
populate_bs_prog_key(&stages[i],
|
||||||
pipeline->base.device,
|
pipeline->base.device,
|
||||||
|
Reference in New Issue
Block a user