aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Weissflog <floooh@gmail.com>2025-11-02 12:37:04 +0100
committerAndre Weissflog <floooh@gmail.com>2025-11-02 12:37:04 +0100
commit84ee4c97dc681aa4d5c8b4edf0d547ef59227c6e (patch)
treedeb602e59e60887b34547fd15f06f8471bc4f6f2
parent9060fe04cc4b74dd9b4ed224926c93cc4d2aa9e7 (diff)
sokol_gfx.h vk: descriptor buffers wip
-rw-r--r--sokol_gfx.h62
1 files changed, 49 insertions, 13 deletions
diff --git a/sokol_gfx.h b/sokol_gfx.h
index e1498f07..d62df26f 100644
--- a/sokol_gfx.h
+++ b/sokol_gfx.h
@@ -6954,7 +6954,9 @@ typedef struct {
_sg_vk_shared_buffer_t uniform;
// resource binding system (using descriptor buffers)
_sg_vk_shared_buffer_t bind;
- VkPhysicalDeviceProperties dev_props;
+ // device properties (initialized at startup)
+ VkPhysicalDeviceProperties2 device_props;
+ VkPhysicalDeviceDescriptorBufferPropertiesEXT descriptor_buffer_props;
} _sg_vk_backend_t;
#endif // SOKOL_VULKAN
@@ -19063,11 +19065,12 @@ _SOKOL_PRIVATE uint32_t _sg_vk_shared_buffer_memcpy(_sg_vk_shared_buffer_t* shbu
return offset;
}
+// uniform data system
_SOKOL_PRIVATE void _sg_vk_uniform_init(void) {
SOKOL_ASSERT(_sg.desc.uniform_buffer_size > 0);
_sg_vk_shared_buffer_init(&_sg.vk.uniform,
(uint32_t)_sg.desc.uniform_buffer_size,
- _sg.vk.dev_props.limits.minUniformBufferOffsetAlignment,
+ _sg.vk.device_props.properties.limits.minUniformBufferOffsetAlignment,
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
"shared-uniform-buffer");
}
@@ -19092,6 +19095,31 @@ _SOKOL_PRIVATE uint32_t _sg_vk_uniform_copy(const sg_range* data) {
return _sg_vk_shared_buffer_memcpy(&_sg.vk.uniform, data->ptr, data->size);
}
+// resource binding system
+_SOKOL_PRIVATE void _sg_vk_bind_init(void) {
+ SOKOL_ASSERT(_sg.desc.vk_descriptor_buffer_size > 0);
+ _sg_vk_shared_buffer_init(&_sg.vk.bind,
+ (uint32_t)_sg.desc.vk_descriptor_buffer_size,
+ _sg.vk.descriptor_buffer_props.descriptorBufferOffsetAlignment,
+ VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT |
+ VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
+ "shared-descriptor-buffer");
+}
+
+_SOKOL_PRIVATE void _sg_vk_bind_discard(void) {
+ _sg_vk_shared_buffer_discard(&_sg.vk.bind);
+}
+
+// called from _sg_vk_acquire_frame_command_buffer()
+_SOKOL_PRIVATE void _sg_vk_bind_after_acquire(void) {
+ _sg_vk_shared_buffer_after_acquire(&_sg.vk.bind);
+}
+
+// called from _sg_vk_submit_frame_command_buffer()
+_SOKOL_PRIVATE void _sg_vk_bind_before_submit(void) {
+ _sg_vk_shared_buffer_before_submit(&_sg.vk.bind);
+}
+
_SOKOL_PRIVATE void _sg_vk_memory_destructor(void* obj) {
SOKOL_ASSERT(_sg.vk.dev && obj);
_sg_vk_mem_free_device_memory((VkDeviceMemory)obj);
@@ -19482,18 +19510,22 @@ _SOKOL_PRIVATE void _sg_vk_init_caps(void) {
_sg.features.draw_base_instance = true;
SOKOL_ASSERT(_sg.vk.phys_dev);
- vkGetPhysicalDeviceProperties(_sg.vk.phys_dev, &_sg.vk.dev_props);
- _sg.limits.max_image_size_2d = (int)_sg.vk.dev_props.limits.maxImageDimension2D;
- _sg.limits.max_image_size_cube = (int)_sg.vk.dev_props.limits.maxImageDimensionCube;
- _sg.limits.max_image_size_3d = (int)_sg.vk.dev_props.limits.maxImageDimension3D;
+ _sg.vk.descriptor_buffer_props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT;
+ _sg.vk.device_props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+ _sg.vk.device_props.pNext = &_sg.vk.descriptor_buffer_props;
+ vkGetPhysicalDeviceProperties2(_sg.vk.phys_dev, &_sg.vk.device_props);
+ const VkPhysicalDeviceLimits* l = &_sg.vk.device_props.properties.limits;
+ _sg.limits.max_image_size_2d = (int)l->maxImageDimension2D;
+ _sg.limits.max_image_size_cube = (int)l->maxImageDimensionCube;
+ _sg.limits.max_image_size_3d = (int)l->maxImageDimension3D;
_sg.limits.max_image_size_array = _sg.limits.max_image_size_2d;
- _sg.limits.max_image_array_layers = (int)_sg.vk.dev_props.limits.maxImageArrayLayers;
- _sg.limits.max_vertex_attrs = _sg_min((int)_sg.vk.dev_props.limits.maxVertexInputAttributes, SG_MAX_VERTEX_ATTRIBUTES);
- _sg.limits.max_color_attachments = _sg_min((int)_sg.vk.dev_props.limits.maxFragmentOutputAttachments, SG_MAX_COLOR_ATTACHMENTS);
- _sg.limits.max_texture_bindings_per_stage = _sg_min((int)_sg.vk.dev_props.limits.maxPerStageDescriptorSampledImages, SG_MAX_VIEW_BINDSLOTS);
- _sg.limits.max_storage_buffer_bindings_per_stage = _sg_min((int)_sg.vk.dev_props.limits.maxPerStageDescriptorStorageBuffers, SG_MAX_VIEW_BINDSLOTS);
- _sg.limits.max_storage_image_bindings_per_stage = _sg_min((int)_sg.vk.dev_props.limits.maxPerStageDescriptorStorageImages, SG_MAX_VIEW_BINDSLOTS);
- _sg.limits.vk_min_uniform_buffer_offset_alignment = (int)_sg.vk.dev_props.limits.minUniformBufferOffsetAlignment;
+ _sg.limits.max_image_array_layers = (int)l->maxImageArrayLayers;
+ _sg.limits.max_vertex_attrs = _sg_min((int)l->maxVertexInputAttributes, SG_MAX_VERTEX_ATTRIBUTES);
+ _sg.limits.max_color_attachments = _sg_min((int)l->maxFragmentOutputAttachments, SG_MAX_COLOR_ATTACHMENTS);
+ _sg.limits.max_texture_bindings_per_stage = _sg_min((int)l->maxPerStageDescriptorSampledImages, SG_MAX_VIEW_BINDSLOTS);
+ _sg.limits.max_storage_buffer_bindings_per_stage = _sg_min((int)l->maxPerStageDescriptorStorageBuffers, SG_MAX_VIEW_BINDSLOTS);
+ _sg.limits.max_storage_image_bindings_per_stage = _sg_min((int)l->maxPerStageDescriptorStorageImages, SG_MAX_VIEW_BINDSLOTS);
+ _sg.limits.vk_min_uniform_buffer_offset_alignment = (int)l->minUniformBufferOffsetAlignment;
// FIXME: currently these are the same as in the WebGPU backend
// FIXME: compressed formats
@@ -19649,6 +19681,7 @@ _SOKOL_PRIVATE void _sg_vk_acquire_frame_command_buffer(void) {
SOKOL_ASSERT(res == VK_SUCCESS);
_sg_vk_uniform_after_acquire();
+ _sg_vk_bind_after_acquire();
}
SOKOL_ASSERT(_sg.vk.frame.cmd_buf);
}
@@ -19656,6 +19689,7 @@ _SOKOL_PRIVATE void _sg_vk_acquire_frame_command_buffer(void) {
_SOKOL_PRIVATE void _sg_vk_submit_frame_command_buffer(void) {
SOKOL_ASSERT(_sg.vk.frame.cmd_buf);
+ _sg_vk_bind_before_submit();
_sg_vk_uniform_before_submit();
VkResult res = vkEndCommandBuffer(_sg.vk.frame.cmd_buf);
@@ -19700,6 +19734,7 @@ _SOKOL_PRIVATE void _sg_vk_setup_backend(const sg_desc* desc) {
_sg_vk_create_frame_command_pool_and_buffers();
_sg_vk_staging_init();
_sg_vk_uniform_init();
+ _sg_vk_bind_init();
_sg_vk_create_delete_queues();
}
@@ -19708,6 +19743,7 @@ _SOKOL_PRIVATE void _sg_vk_discard_backend(void) {
SOKOL_ASSERT(_sg.vk.dev);
vkDeviceWaitIdle(_sg.vk.dev);
_sg_vk_destroy_delete_queues();
+ _sg_vk_bind_discard();
_sg_vk_uniform_discard();
_sg_vk_staging_discard();
_sg_vk_destroy_frame_command_pool();