ogl_beamforming

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

Commit: 7af82b9de344becfbb86b6ec3c1cd265480de7db
Parent: 5fd4080025709d9bfebc35cd21376a999f306364
Author: Randy Palamar
Date:   Wed, 14 Jan 2026 07:00:19 -0700

vulkan: add subgroup size to gpu info

Diffstat:
Mbeamformer_internal.h | 4+++-
Mvulkan.c | 9+++++----
Mvulkan.h | 48++++++++++++++++++++++++++++++++++++++++++------
3 files changed, 50 insertions(+), 11 deletions(-)

diff --git a/beamformer_internal.h b/beamformer_internal.h @@ -48,7 +48,9 @@ typedef struct { f32 timestamp_period_ns; u32 max_compute_shared_memory_size; - u32 max_msaa_samples; + u16 max_msaa_samples; + u16 subgroup_size; + u32 max_image_dimension_2D; // NOTE(rnp): vulkan compute will output to a buffer so this won't be relevant u32 max_image_dimension_3D; diff --git a/vulkan.c b/vulkan.c @@ -205,9 +205,9 @@ vk_load_physical_device(Arena arena, Stream *err) if (!vk->physical_device) fatal(vulkan_info("failed to find a suitable GPU\n")); - VkPhysicalDeviceProperties2 dp = {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2}; - VkPhysicalDeviceMaintenance3Properties dm3p = {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES}; - dp.pNext = &dm3p; + VkPhysicalDeviceProperties2 dp = {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2}; + VkPhysicalDeviceVulkan11Properties v11p = {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES}; + dp.pNext= &v11p; vkGetPhysicalDeviceProperties2(vk->physical_device, &dp); @@ -313,7 +313,7 @@ vk_load_physical_device(Arena arena, Stream *err) vk->memory_info.memory_host_coherent[it] = (flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0; } - vk->memory_info.max_allocation_size = dm3p.maxMemoryAllocationSize; + vk->memory_info.max_allocation_size = v11p.maxMemoryAllocationSize; vk->memory_info.non_coherent_atom_size = dp.properties.limits.nonCoherentAtomSize; vk->gpu_info.vendor = dp.properties.vendorID; vk->gpu_info.gpu_heap_size = bmp->memoryHeaps[vk->memory_info.gpu_heap_index].size; @@ -321,6 +321,7 @@ vk_load_physical_device(Arena arena, Stream *err) vk->gpu_info.max_image_dimension_2D = dp.properties.limits.maxImageDimension2D; vk->gpu_info.max_image_dimension_3D = dp.properties.limits.maxImageDimension3D; vk->gpu_info.max_msaa_samples = round_down_power_of_two(dp.properties.limits.framebufferColorSampleCounts); + vk->gpu_info.subgroup_size = v11p.subgroupSize; vk->gpu_info.max_compute_shared_memory_size = dp.properties.limits.maxComputeSharedMemorySize; // IMPORTANT(rnp): memory must only be pushed at the end of the function diff --git a/vulkan.h b/vulkan.h @@ -13,6 +13,7 @@ #define VK_MAX_EXTENSION_NAME_SIZE 256U #define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256U #define VK_UUID_SIZE 16U +#define VK_LUID_SIZE 8U #define VK_MAX_MEMORY_TYPES 32U #define VK_MAX_MEMORY_HEAPS 16U @@ -83,6 +84,7 @@ typedef enum { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO = 40, VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO = 42, VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 43, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES = 50, VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000, VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 = 1000059001, @@ -94,7 +96,6 @@ typedef enum { VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO = 1000077000, VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR = 1000078003, VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR = 1000079001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000, VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF, } VkStructureType; @@ -181,6 +182,12 @@ typedef VkFlags VkPipelineStageFlags; typedef VkFlags VkDeviceCreateFlags; typedef enum { + VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES = 0, + VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY = 1, + VK_POINT_CLIPPING_BEHAVIOR_MAX_ENUM = 0x7FFFFFFF +} VkPointClippingBehavior; + +typedef enum { VK_SAMPLE_COUNT_1_BIT = 0x00000001, VK_SAMPLE_COUNT_2_BIT = 0x00000002, VK_SAMPLE_COUNT_4_BIT = 0x00000004, @@ -1228,6 +1235,22 @@ typedef enum { typedef VkFlags VkMemoryMapFlags; typedef enum { + VK_SUBGROUP_FEATURE_BASIC_BIT = 0x00000001, + VK_SUBGROUP_FEATURE_VOTE_BIT = 0x00000002, + VK_SUBGROUP_FEATURE_ARITHMETIC_BIT = 0x00000004, + VK_SUBGROUP_FEATURE_BALLOT_BIT = 0x00000008, + VK_SUBGROUP_FEATURE_SHUFFLE_BIT = 0x00000010, + VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = 0x00000020, + VK_SUBGROUP_FEATURE_CLUSTERED_BIT = 0x00000040, + VK_SUBGROUP_FEATURE_QUAD_BIT = 0x00000080, + VK_SUBGROUP_FEATURE_ROTATE_BIT = 0x00000200, + VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT = 0x00000400, + VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV = 0x00000100, + VK_SUBGROUP_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSubgroupFeatureFlagBits; +typedef VkFlags VkSubgroupFeatureFlags; + +typedef enum { VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT = 0x00000001, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT = 0x00000002, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000004, @@ -1485,11 +1508,24 @@ typedef struct { } VkPhysicalDeviceMemoryProperties2; typedef struct { - VkStructureType sType; - void * pNext; - uint32_t maxPerSetDescriptors; - VkDeviceSize maxMemoryAllocationSize; -} VkPhysicalDeviceMaintenance3Properties; + VkStructureType sType; + void * pNext; + uint8_t deviceUUID[VK_UUID_SIZE]; + uint8_t driverUUID[VK_UUID_SIZE]; + uint8_t deviceLUID[VK_LUID_SIZE]; + uint32_t deviceNodeMask; + VkBool32 deviceLUIDValid; + uint32_t subgroupSize; + VkShaderStageFlags subgroupSupportedStages; + VkSubgroupFeatureFlags subgroupSupportedOperations; + VkBool32 subgroupQuadOperationsInAllStages; + VkPointClippingBehavior pointClippingBehavior; + uint32_t maxMultiviewViewCount; + uint32_t maxMultiviewInstanceIndex; + VkBool32 protectedNoFault; + uint32_t maxPerSetDescriptors; + VkDeviceSize maxMemoryAllocationSize; +} VkPhysicalDeviceVulkan11Properties; typedef struct { uint32_t apiVersion;