From 0c9dfa90f93999d6cadea0deee5aa433d4fdcd2a Mon Sep 17 00:00:00 2001 From: squidbus Date: Thu, 30 Apr 2026 21:27:53 -0700 Subject: [PATCH] kk: Support robustBufferAccess2 Add missing vertex input robustness 2 behavior and advertise. Reviewed-by: Aitor Camacho Part-of: --- src/kosmickrisp/vulkan/kk_nir_lower_vbo.c | 21 +++++++++++++++++++-- src/kosmickrisp/vulkan/kk_nir_lower_vbo.h | 3 ++- src/kosmickrisp/vulkan/kk_shader.c | 14 ++++++++------ 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/kosmickrisp/vulkan/kk_nir_lower_vbo.c b/src/kosmickrisp/vulkan/kk_nir_lower_vbo.c index 24c976b9a95..90803c2144c 100644 --- a/src/kosmickrisp/vulkan/kk_nir_lower_vbo.c +++ b/src/kosmickrisp/vulkan/kk_nir_lower_vbo.c @@ -20,6 +20,7 @@ struct ctx { bool requires_vertex_id; bool requires_instance_id; bool requires_base_instance; + bool requires_robustness2; }; static bool @@ -201,6 +202,18 @@ pass(struct nir_builder *b, nir_intrinsic_instr *intr, void *data) b, interchange_comps, interchange_register_size, base, stride_offset_el, .format = interchange_format, .base = 0u); + if (ctx->requires_robustness2) { + uint64_t attrib_clamp_offset = offsetof( + struct kk_root_descriptor_table, draw.attrib_clamps[index]); + nir_def *bounds = nir_load_global_constant( + b, 1, 32, nir_iadd_imm(b, argbuf, attrib_clamp_offset)); + nir_def *oob = nir_ult(b, bounds, el); + + /* Produce zero for out-of-bounds access */ + nir_def *zero = nir_imm_zero(b, memory->num_components, memory->bit_size); + memory = nir_bcsel(b, oob, zero, memory); + } + unsigned dest_size = intr->def.bit_size; unsigned bits[] = {desc->channel[chan].size, desc->channel[chan].size, desc->channel[chan].size, desc->channel[chan].size}; @@ -261,11 +274,15 @@ pass(struct nir_builder *b, nir_intrinsic_instr *intr, void *data) } bool -kk_nir_lower_vbo(nir_shader *nir, struct kk_attribute *attribs) +kk_nir_lower_vbo(nir_shader *nir, struct kk_attribute *attribs, + bool robustness2) { assert(nir->info.stage == MESA_SHADER_VERTEX); - struct ctx ctx = {.attribs = attribs}; + struct ctx ctx = { + .attribs = attribs, + .requires_robustness2 = robustness2, + }; bool progress = nir_shader_intrinsics_pass(nir, pass, nir_metadata_control_flow, &ctx); diff --git a/src/kosmickrisp/vulkan/kk_nir_lower_vbo.h b/src/kosmickrisp/vulkan/kk_nir_lower_vbo.h index 436e070794a..af47837e1f6 100644 --- a/src/kosmickrisp/vulkan/kk_nir_lower_vbo.h +++ b/src/kosmickrisp/vulkan/kk_nir_lower_vbo.h @@ -35,7 +35,8 @@ struct kk_attribute { bool instanced : 1; }; -bool kk_nir_lower_vbo(nir_shader *shader, struct kk_attribute *attribs); +bool kk_nir_lower_vbo(nir_shader *shader, struct kk_attribute *attribs, + bool robustness2); bool kk_vbo_supports_format(enum pipe_format format); diff --git a/src/kosmickrisp/vulkan/kk_shader.c b/src/kosmickrisp/vulkan/kk_shader.c index 8c4fea4e26d..76a06b5cf2f 100644 --- a/src/kosmickrisp/vulkan/kk_shader.c +++ b/src/kosmickrisp/vulkan/kk_shader.c @@ -36,12 +36,11 @@ kk_get_nir_options(struct vk_physical_device *vk_pdev, mesa_shader_stage stage, return &kk_nir_options; } -/* TODO_KOSMICKRISP Once we support robustness2, update these values. */ static const struct vk_pipeline_robustness_state rs_all_supported = { .uniform_buffers = - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2, .storage_buffers = - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2, .images = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT, }; @@ -287,7 +286,8 @@ kk_nir_swizzle_fragment_output(nir_builder *b, nir_intrinsic_instr *intrin, } static void -kk_lower_vs_vbo(nir_shader *nir, const struct vk_graphics_pipeline_state *state) +kk_lower_vs_vbo(nir_shader *nir, const struct vk_graphics_pipeline_state *state, + const struct vk_pipeline_robustness_state *rs) { assert(!(nir->info.inputs_read & BITFIELD64_MASK(VERT_ATTRIB_GENERIC0)) && "Fixed-function attributes not used in Vulkan"); @@ -315,7 +315,9 @@ kk_lower_vs_vbo(nir_shader *nir, const struct vk_graphics_pipeline_state *state) attributes[slot].instanced = binding->input_rate == VK_VERTEX_INPUT_RATE_INSTANCE; } - NIR_PASS(_, nir, kk_nir_lower_vbo, attributes); + bool robustness2 = rs->vertex_inputs == + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2; + NIR_PASS(_, nir, kk_nir_lower_vbo, attributes, robustness2); } static void @@ -705,7 +707,7 @@ kk_compile_shader(struct kk_device *dev, struct vk_shader_compile_info *info, /* VBO lowering needs to go here otherwise, the linking step removes all * inputs since we read vertex attributes from UBOs. */ if (info->stage == MESA_SHADER_VERTEX) { - kk_lower_vs_vbo(nir, state); + kk_lower_vs_vbo(nir, state, info->robustness); } msl_lower_nir_late(nir); msl_optimize_nir(nir);