From 11d329c4d972896a7a7465e5a99ed7ec2edf7332 Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Sun, 8 Jun 2025 13:50:08 -0400 Subject: [PATCH] fix some jazz --- .../src/uniforms/vulkan_uniform_layout.h | 1 + .../vulkan/src/uniforms/vulkan_uniform_pool.c | 38 +++++++++++-------- .../vulkan/src/uniforms/vulkan_uniform_pool.h | 9 ++++- src/core/gryphn_platform_functions.h | 1 + src/core/instance/init/gryphn_init.c | 1 + src/core/uniforms/gryphn_uniform_pool.c | 4 ++ src/core/uniforms/gryphn_uniform_pool.h | 1 + 7 files changed, 38 insertions(+), 17 deletions(-) diff --git a/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.h b/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.h index 086d65b..5399314 100644 --- a/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.h +++ b/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.h @@ -3,3 +3,4 @@ #include VkDescriptorSetLayout* vkGryphnCreateSetLayouts(const gnUniformLayout* layout, uint32_t* setCount, VkDevice device); +VkDescriptorType vkGryphnUniformType(gnUniformType type); diff --git a/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c b/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c index ef3436b..2a0da3c 100644 --- a/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c +++ b/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c @@ -5,42 +5,50 @@ gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) { pool->uniformPool = malloc(sizeof(struct gnPlatformUniformPool_t)); - pool->uniformPool->poolCount = pool->uniformPool->maxPoolCount = 1; - pool->uniformPool->pools = malloc(sizeof(VkDescriptorPool) * pool->uniformPool->maxPoolCount); + pool->uniformPool->poolCount = 0; + pool->uniformPool->maxPoolCount = 1; + pool->uniformPool->pools = malloc(sizeof(vkGryphnUniformPool) * pool->uniformPool->maxPoolCount); return GN_SUCCESS; } gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, const gnUniformLayout layout) { - uint32_t setCount; - VkDescriptorSetLayout* layouts = vkGryphnCreateSetLayouts(&layout, &setCount, pool->device->outputDevice->device); + if (pool->uniformPool->poolCount >= pool->uniformPool->maxPoolCount) { + pool->uniformPool->maxPoolCount *= 2; + pool->uniformPool->pools = realloc(pool->uniformPool->pools, sizeof(vkGryphnUniformPool) * pool->uniformPool->maxPoolCount); + } + + pool->uniformPool->pools[pool->uniformPool->poolCount].layouts = vkGryphnCreateSetLayouts(&layout, &pool->uniformPool->pools[pool->uniformPool->poolCount].layoutCount, pool->device->outputDevice->device); VkDescriptorPoolSize* sizes = malloc(sizeof(VkDescriptorPoolSize) * layout.uniformBindingCount); - gnUniform* uniforms = malloc(sizeof(gnUniform) * setCount); + gnUniform* uniforms = malloc(sizeof(gnUniform) * pool->uniformPool->pools[pool->uniformPool->poolCount].layoutCount); for (int i = 0; i < layout.uniformBindingCount; i++) { - + sizes[i].type = vkGryphnUniformType(layout.uniformBindings[i].type); + sizes[i].descriptorCount = 1; } VkDescriptorPoolCreateInfo poolInfo = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, .poolSizeCount = layout.uniformBindingCount, - .maxSets = layout.uniformBindingCount, .pPoolSizes = sizes, + .maxSets = layout.uniformBindingCount, }; - if (pool->uniformPool->poolCount >= pool->uniformPool->maxPoolCount) { - pool->uniformPool->maxPoolCount *= 2; - pool->uniformPool->pools = realloc(pool->uniformPool->pools, sizeof(VkDescriptorPool) * pool->uniformPool->maxPoolCount); - } - if (vkCreateDescriptorPool( pool->device->outputDevice->device, &poolInfo, NULL, - &pool->uniformPool->pools[pool->uniformPool->poolCount] + &pool->uniformPool->pools[pool->uniformPool->poolCount].pool ) != VK_SUCCESS) return NULL; pool->uniformPool->poolCount++; - - free(layouts); free(sizes); return uniforms; } + +void gnDestroyUniformPoolFn(gnUniformPool pool) { + for (int i = 0; i < pool->uniformPool->poolCount; i++) { + for (int k = 0; k < pool->uniformPool->pools[i].layoutCount; k++) + vkDestroyDescriptorSetLayout(pool->device->outputDevice->device, pool->uniformPool->pools[i].layouts[k], NULL); + vkDestroyDescriptorPool(pool->device->outputDevice->device, pool->uniformPool->pools[i].pool, NULL); + } + free(pool->uniformPool); +} diff --git a/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.h b/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.h index 547f0e6..8bef4ca 100644 --- a/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.h +++ b/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.h @@ -1,9 +1,14 @@ #pragma once #include #include -#include "core/uniforms/gryphn_uniform_layout.h" + +typedef struct vkGryphnUniformPool { + VkDescriptorPool pool; + uint32_t layoutCount; + VkDescriptorSetLayout* layouts; +} vkGryphnUniformPool; struct gnPlatformUniformPool_t { uint32_t poolCount, maxPoolCount; - VkDescriptorPool* pools; + vkGryphnUniformPool* pools; }; diff --git a/src/core/gryphn_platform_functions.h b/src/core/gryphn_platform_functions.h index 3a291a5..d10c5f2 100644 --- a/src/core/gryphn_platform_functions.h +++ b/src/core/gryphn_platform_functions.h @@ -89,6 +89,7 @@ typedef struct gnDeviceFunctions_t { gnReturnCode (*_gnCreateUniformPool)(gnUniformPool pool, gnDeviceHandle device); gnUniform* (*_gnUniformPoolAllocateUniforms)(gnUniformPool pool, const gnUniformLayout layout); + void (*_gnDestroyUniformPool)(gnUniformPool pool); gnReturnCode (*_gnCreateFence)(gnFenceHandle fence, gnOutputDeviceHandle device); void (*_gnSignalFence)(gnFenceHandle fence); diff --git a/src/core/instance/init/gryphn_init.c b/src/core/instance/init/gryphn_init.c index 60803fa..70c6d07 100644 --- a/src/core/instance/init/gryphn_init.c +++ b/src/core/instance/init/gryphn_init.c @@ -91,6 +91,7 @@ void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFuncti gnLoadDLLFunction(lib, functions->_gnDestroyBuffer, "gnDestroyBufferFn"); gnLoadDLLFunction(lib, functions->_gnCreateUniformPool, "gnCreateUniformPoolFn"); gnLoadDLLFunction(lib, functions->_gnUniformPoolAllocateUniforms, "gnUniformPoolAllocateUniformsFn"); + gnLoadDLLFunction(lib, functions->_gnDestroyUniformPool, "gnDestroyUniformPoolFn"); gnLoadDLLFunction(lib, functions->_gnCreateFence, "gnCreateFenceFn"); gnLoadDLLFunction(lib, functions->_gnSignalFence, "gnSignalFenceFn"); gnLoadDLLFunction(lib, functions->_gnWaitForFence, "gnWaitForFenceFn"); diff --git a/src/core/uniforms/gryphn_uniform_pool.c b/src/core/uniforms/gryphn_uniform_pool.c index b5c5f5d..5ac87ec 100644 --- a/src/core/uniforms/gryphn_uniform_pool.c +++ b/src/core/uniforms/gryphn_uniform_pool.c @@ -12,3 +12,7 @@ gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device) { gnUniform* gnUniformPoolAllocateUniforms(gnUniformPool pool, const gnUniformLayout layout) { return pool->device->deviceFunctions->_gnUniformPoolAllocateUniforms(pool, layout); } + +void gnDestroyUniformPool(gnUniformPool pool) { + pool->device->deviceFunctions->_gnDestroyUniformPool(pool); +} diff --git a/src/core/uniforms/gryphn_uniform_pool.h b/src/core/uniforms/gryphn_uniform_pool.h index 6b47ae4..348aef7 100644 --- a/src/core/uniforms/gryphn_uniform_pool.h +++ b/src/core/uniforms/gryphn_uniform_pool.h @@ -12,3 +12,4 @@ struct gnUniformPool_t { gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device); gnUniform* gnUniformPoolAllocateUniforms(gnUniformPool pool, const gnUniformLayout layout); +void gnDestroyUniformPool(gnUniformPool pool);