Commit: 7af82b9de344becfbb86b6ec3c1cd265480de7db
Parent: 5fd4080025709d9bfebc35cd21376a999f306364
Author: Randy Palamar
Date: Wed, 14 Jan 2026 07:00:19 -0700
vulkan: add subgroup size to gpu info
Diffstat:
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;