fix some jazz

This commit is contained in:
Greg Wells
2025-06-08 13:50:08 -04:00
parent 04808a14dd
commit 11d329c4d9
7 changed files with 38 additions and 17 deletions

View File

@@ -3,3 +3,4 @@
#include <core/uniforms/gryphn_uniform_layout.h> #include <core/uniforms/gryphn_uniform_layout.h>
VkDescriptorSetLayout* vkGryphnCreateSetLayouts(const gnUniformLayout* layout, uint32_t* setCount, VkDevice device); VkDescriptorSetLayout* vkGryphnCreateSetLayouts(const gnUniformLayout* layout, uint32_t* setCount, VkDevice device);
VkDescriptorType vkGryphnUniformType(gnUniformType type);

View File

@@ -5,42 +5,50 @@
gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) { gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) {
pool->uniformPool = malloc(sizeof(struct gnPlatformUniformPool_t)); pool->uniformPool = malloc(sizeof(struct gnPlatformUniformPool_t));
pool->uniformPool->poolCount = pool->uniformPool->maxPoolCount = 1; pool->uniformPool->poolCount = 0;
pool->uniformPool->pools = malloc(sizeof(VkDescriptorPool) * pool->uniformPool->maxPoolCount); pool->uniformPool->maxPoolCount = 1;
pool->uniformPool->pools = malloc(sizeof(vkGryphnUniformPool) * pool->uniformPool->maxPoolCount);
return GN_SUCCESS; return GN_SUCCESS;
} }
gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, const gnUniformLayout layout) { gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, const gnUniformLayout layout) {
uint32_t setCount; if (pool->uniformPool->poolCount >= pool->uniformPool->maxPoolCount) {
VkDescriptorSetLayout* layouts = vkGryphnCreateSetLayouts(&layout, &setCount, pool->device->outputDevice->device); 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); 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++) { for (int i = 0; i < layout.uniformBindingCount; i++) {
sizes[i].type = vkGryphnUniformType(layout.uniformBindings[i].type);
sizes[i].descriptorCount = 1;
} }
VkDescriptorPoolCreateInfo poolInfo = { VkDescriptorPoolCreateInfo poolInfo = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
.poolSizeCount = layout.uniformBindingCount, .poolSizeCount = layout.uniformBindingCount,
.maxSets = layout.uniformBindingCount,
.pPoolSizes = sizes, .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( if (vkCreateDescriptorPool(
pool->device->outputDevice->device, &poolInfo, NULL, pool->device->outputDevice->device, &poolInfo, NULL,
&pool->uniformPool->pools[pool->uniformPool->poolCount] &pool->uniformPool->pools[pool->uniformPool->poolCount].pool
) != VK_SUCCESS) ) != VK_SUCCESS)
return NULL; return NULL;
pool->uniformPool->poolCount++; pool->uniformPool->poolCount++;
free(layouts);
free(sizes); free(sizes);
return uniforms; 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);
}

View File

@@ -1,9 +1,14 @@
#pragma once #pragma once
#include <vulkan/vulkan.h> #include <vulkan/vulkan.h>
#include <core/uniforms/gryphn_uniform_pool.h> #include <core/uniforms/gryphn_uniform_pool.h>
#include "core/uniforms/gryphn_uniform_layout.h"
typedef struct vkGryphnUniformPool {
VkDescriptorPool pool;
uint32_t layoutCount;
VkDescriptorSetLayout* layouts;
} vkGryphnUniformPool;
struct gnPlatformUniformPool_t { struct gnPlatformUniformPool_t {
uint32_t poolCount, maxPoolCount; uint32_t poolCount, maxPoolCount;
VkDescriptorPool* pools; vkGryphnUniformPool* pools;
}; };

View File

@@ -89,6 +89,7 @@ typedef struct gnDeviceFunctions_t {
gnReturnCode (*_gnCreateUniformPool)(gnUniformPool pool, gnDeviceHandle device); gnReturnCode (*_gnCreateUniformPool)(gnUniformPool pool, gnDeviceHandle device);
gnUniform* (*_gnUniformPoolAllocateUniforms)(gnUniformPool pool, const gnUniformLayout layout); gnUniform* (*_gnUniformPoolAllocateUniforms)(gnUniformPool pool, const gnUniformLayout layout);
void (*_gnDestroyUniformPool)(gnUniformPool pool);
gnReturnCode (*_gnCreateFence)(gnFenceHandle fence, gnOutputDeviceHandle device); gnReturnCode (*_gnCreateFence)(gnFenceHandle fence, gnOutputDeviceHandle device);
void (*_gnSignalFence)(gnFenceHandle fence); void (*_gnSignalFence)(gnFenceHandle fence);

View File

@@ -91,6 +91,7 @@ void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFuncti
gnLoadDLLFunction(lib, functions->_gnDestroyBuffer, "gnDestroyBufferFn"); gnLoadDLLFunction(lib, functions->_gnDestroyBuffer, "gnDestroyBufferFn");
gnLoadDLLFunction(lib, functions->_gnCreateUniformPool, "gnCreateUniformPoolFn"); gnLoadDLLFunction(lib, functions->_gnCreateUniformPool, "gnCreateUniformPoolFn");
gnLoadDLLFunction(lib, functions->_gnUniformPoolAllocateUniforms, "gnUniformPoolAllocateUniformsFn"); gnLoadDLLFunction(lib, functions->_gnUniformPoolAllocateUniforms, "gnUniformPoolAllocateUniformsFn");
gnLoadDLLFunction(lib, functions->_gnDestroyUniformPool, "gnDestroyUniformPoolFn");
gnLoadDLLFunction(lib, functions->_gnCreateFence, "gnCreateFenceFn"); gnLoadDLLFunction(lib, functions->_gnCreateFence, "gnCreateFenceFn");
gnLoadDLLFunction(lib, functions->_gnSignalFence, "gnSignalFenceFn"); gnLoadDLLFunction(lib, functions->_gnSignalFence, "gnSignalFenceFn");
gnLoadDLLFunction(lib, functions->_gnWaitForFence, "gnWaitForFenceFn"); gnLoadDLLFunction(lib, functions->_gnWaitForFence, "gnWaitForFenceFn");

View File

@@ -12,3 +12,7 @@ gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device) {
gnUniform* gnUniformPoolAllocateUniforms(gnUniformPool pool, const gnUniformLayout layout) { gnUniform* gnUniformPoolAllocateUniforms(gnUniformPool pool, const gnUniformLayout layout) {
return pool->device->deviceFunctions->_gnUniformPoolAllocateUniforms(pool, layout); return pool->device->deviceFunctions->_gnUniformPoolAllocateUniforms(pool, layout);
} }
void gnDestroyUniformPool(gnUniformPool pool) {
pool->device->deviceFunctions->_gnDestroyUniformPool(pool);
}

View File

@@ -12,3 +12,4 @@ struct gnUniformPool_t {
gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device); gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device);
gnUniform* gnUniformPoolAllocateUniforms(gnUniformPool pool, const gnUniformLayout layout); gnUniform* gnUniformPoolAllocateUniforms(gnUniformPool pool, const gnUniformLayout layout);
void gnDestroyUniformPool(gnUniformPool pool);