ogl_beamforming

Ultrasound Beamforming Implemented with OpenGL
git clone anongit@rnpnr.xyz:ogl_beamforming.git
Log | Files | Refs | Feed | Submodules | README | LICENSE

Commit: aa0d23b2a8b93c195fc5eccf83b02a13d9419b7e
Parent: 3e1e6d2be7d2b644d705345adb67b6c503e94c0f
Author: Randy Palamar
Date:   Thu, 11 Jun 2026 12:16:09 -0600

vulkan: enable nullDescriptor to shut up validation warning

These are all written before they are used but that size of the
last one is determined at runtime after data has been received so
it can't be preassigned. Realistically nullDescriptor shouldn't
cause any issues because this was how all pre-Vulkan/DX12 APIs
worked.

Diffstat:
Mvulkan.c | 13+++++++++++++
Mvulkan.h | 11+++++++++++
2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/vulkan.c b/vulkan.c @@ -2,6 +2,7 @@ // TODO(rnp) // [ ]: what is needed for HDR? I think it makes sense to just default to it nowadays // [ ]: once opengl is removed switch images to SRGB and/or 16 bit Float +// [ ]: VK_KHR_robustness2 probably shouldn't be required but it also might not matter #include "beamformer_internal.h" #include "vulkan.h" @@ -184,6 +185,7 @@ read_only global const char *vk_required_instance_extensions[] = { X("VK_KHR_16bit_storage") \ X("VK_KHR_external_memory") \ X("VK_KHR_external_semaphore") \ + X("VK_KHR_robustness2") \ X("VK_KHR_storage_buffer_storage_class") \ X("VK_KHR_timeline_semaphore") \ VK_OS_REQUIRED_DEVICE_EXTENSIONS_LIST @@ -1640,6 +1642,13 @@ vk_load_queues(Arena *memory, Stream *err) device_create_info.pNext = &coop_mat_features; } + VkPhysicalDeviceRobustness2FeaturesKHR robust2 = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR, + .pNext = (void *)device_create_info.pNext, + .nullDescriptor = 1, + }; + device_create_info.pNext = &robust2; + VkPhysicalDeviceVulkan13Features v13f = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, .pNext = (void *)device_create_info.pNext, @@ -1826,6 +1835,10 @@ vk_load_descriptor_block(void) vk_label_object(DESCRIPTOR_SET_LAYOUT, vk->descriptor_set_layouts[it], stream_to_s8(&sb), s8("Set Layout")); } } + + // NOTE(rnp): junk API requirement that doesn't allow 0 initialization + for EachElement(vk->descriptor_buffer_infos, it) + vk->descriptor_buffer_infos[it].range = VK_WHOLE_SIZE; } /////////////////////// diff --git a/vulkan.h b/vulkan.h @@ -21,6 +21,8 @@ #define VK_MAX_MEMORY_TYPES 32U #define VK_MAX_MEMORY_HEAPS 16U +#define VK_WHOLE_SIZE (~0ULL) + #define VK_SUBPASS_EXTERNAL (~0U) // NOTE: keeps type safety over void * @@ -133,6 +135,7 @@ typedef enum { VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO = 1000207005, VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO = 1000244001, VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR = 1000286000, VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2 = 1000314001, VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 = 1000314002, VK_STRUCTURE_TYPE_DEPENDENCY_INFO = 1000314003, @@ -2210,6 +2213,14 @@ typedef struct { } VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR; typedef struct { + VkStructureType sType; + void * pNext; + VkBool32 robustBufferAccess2; + VkBool32 robustImageAccess2; + VkBool32 nullDescriptor; +} VkPhysicalDeviceRobustness2FeaturesKHR; + +typedef struct { VkStructureType sType; void * pNext; VkPhysicalDeviceFeatures features;