horrible uniform pool API

This commit is contained in:
Greg Wells
2025-06-08 13:40:40 -04:00
parent 92ba48005f
commit 04808a14dd
13 changed files with 112 additions and 48 deletions

View File

@@ -2,6 +2,7 @@
#include "output_device/vulkan_output_devices.h"
#include "shader_module/vulkan_shader_module.h"
#include "renderpass/vulkan_render_pass_descriptor.h"
#include "uniforms/vulkan_uniform_layout.h"
VkDynamicState vkGryphnDynamicStateToVulkanDynamicState(enum gnDynamicState_e state) {
switch (state) {
@@ -60,13 +61,7 @@ VkFormat vkGryphnVertexFormat(gnVertexFormat format) {
}
}
VkDescriptorType vkGryphnUniformType(gnUniformType type) {
switch(type) {
case GN_UNIFORM_BUFFER_DESCRIPTOR: return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
}
}
gnReturnCode gnCreateGraphicsPipelineFn(struct gnGraphicsPipeline_t* graphicsPipeline, struct gnOutputDevice_t* device, struct gnGraphicsPipelineInfo_t info) {
gnReturnCode gnCreateGraphicsPipelineFn(gnGraphicsPipeline graphicsPipeline, gnDevice device, gnGraphicsPipelineInfo info) {
graphicsPipeline->graphicsPipeline = malloc(sizeof(gnPlatformGraphicsPipeline));
for (int i = 0; i < GN_DYNAMIC_STATE_MAX; i++) graphicsPipeline->graphicsPipeline->isDynamic[i] = gnFalse;
@@ -184,27 +179,9 @@ gnReturnCode gnCreateGraphicsPipelineFn(struct gnGraphicsPipeline_t* graphicsPip
.blendConstants[3] = 0.0f
};
graphicsPipeline->graphicsPipeline->setCount = info.uniformLayout.uniformBindingCount;
graphicsPipeline->graphicsPipeline->sets = malloc(sizeof(VkDescriptorSetLayoutBinding) * info.uniformLayout.uniformBindingCount);
for (int i = 0; i < info.uniformLayout.uniformBindingCount; i++) {
VkDescriptorSetLayoutBinding setLayout = {
.binding = info.uniformLayout.uniformBindings[i].binding,
.descriptorCount = 1,
.descriptorType = vkGryphnUniformType(info.uniformLayout.uniformBindings[i].type),
.stageFlags = vkGryphnShaderModuleStage(info.uniformLayout.uniformBindings[i].stage)
};
VkDescriptorSetLayoutCreateInfo info = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
.bindingCount = 1,
.pBindings = &setLayout
};
if (vkCreateDescriptorSetLayout(device->outputDevice->device, &info, NULL, &graphicsPipeline->graphicsPipeline->sets[i]) != VK_SUCCESS) {
return GN_FAILED_TO_CREATE_UNIFORM_LAYOUT;
}
}
graphicsPipeline->graphicsPipeline->sets = vkGryphnCreateSetLayouts(
&info.uniformLayout, &graphicsPipeline->graphicsPipeline->setCount, device->outputDevice->device
);
VkPipelineLayoutCreateInfo pipelineLayoutInfo = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,

View File

@@ -0,0 +1,6 @@
#pragma once
#include <vulkan/vulkan.h>
typedef struct gnPlatformUniform_t {
VkDescriptorSet set;
} gnPlatformUniform;

View File

@@ -0,0 +1,38 @@
#include "vulkan_uniform_layout.h"
#include <shader_module/vulkan_shader_module.h>
VkDescriptorType vkGryphnUniformType(gnUniformType type) {
switch(type) {
case GN_UNIFORM_BUFFER_DESCRIPTOR: return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
case GN_UNIFORM_TYPE_MAX: return VK_DESCRIPTOR_TYPE_MAX_ENUM;
}
}
VkDescriptorSetLayout* vkGryphnCreateSetLayouts(
const gnUniformLayout* layout, uint32_t* setCount,
VkDevice device
) {
gnUniformLayout uniformLayout = *layout;
*setCount = uniformLayout.uniformBindingCount;
VkDescriptorSetLayout* sets = malloc(sizeof(VkDescriptorSetLayoutBinding) * uniformLayout.uniformBindingCount);
for (int i = 0; i < uniformLayout.uniformBindingCount; i++) {
VkDescriptorSetLayoutBinding setLayout = {
.binding = uniformLayout.uniformBindings[i].binding,
.descriptorCount = 1,
.descriptorType = vkGryphnUniformType(uniformLayout.uniformBindings[i].type),
.stageFlags = vkGryphnShaderModuleStage(uniformLayout.uniformBindings[i].stage)
};
VkDescriptorSetLayoutCreateInfo info = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
.bindingCount = 1,
.pBindings = &setLayout
};
if (vkCreateDescriptorSetLayout(device, &info, NULL, sets) != VK_SUCCESS) {
return NULL;
}
}
return sets;
}

View File

@@ -0,0 +1,5 @@
#pragma once
#include <vulkan/vulkan.h>
#include <core/uniforms/gryphn_uniform_layout.h>
VkDescriptorSetLayout* vkGryphnCreateSetLayouts(const gnUniformLayout* layout, uint32_t* setCount, VkDevice device);

View File

@@ -1,11 +1,46 @@
#include "vulkan_uniform_pool.h"
#include "vulkan_uniform_layout.h"
#include "stdlib.h"
#include "output_device/vulkan_output_devices.h"
gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) {
pool->uniformPool = malloc(sizeof(struct gnPlatformUniformPool_t));
pool->uniformPool->maxUniformPools = 0;
pool->uniformPool->uniformPoolCount = 0;
pool->uniformPool->poolCount = pool->uniformPool->maxPoolCount = 1;
pool->uniformPool->pools = malloc(sizeof(VkDescriptorPool) * 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);
VkDescriptorPoolSize* sizes = malloc(sizeof(VkDescriptorPoolSize) * layout.uniformBindingCount);
gnUniform* uniforms = malloc(sizeof(gnUniform) * setCount);
for (int i = 0; i < layout.uniformBindingCount; i++) {
}
VkDescriptorPoolCreateInfo poolInfo = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
.poolSizeCount = layout.uniformBindingCount,
.maxSets = layout.uniformBindingCount,
.pPoolSizes = sizes,
};
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]
) != VK_SUCCESS)
return NULL;
pool->uniformPool->poolCount++;
free(layouts);
free(sizes);
return uniforms;
}

View File

@@ -3,13 +3,7 @@
#include <core/uniforms/gryphn_uniform_pool.h>
#include "core/uniforms/gryphn_uniform_layout.h"
typedef struct VkGryphnUniformPool {
VkDescriptorPool pool;
gnUniformType type;
} VkGryphnUniformPool;
struct gnPlatformUniformPool_t {
int maxUniformPools;
int uniformPoolCount;
VkGryphnUniformPool* pools;
uint32_t poolCount, maxPoolCount;
VkDescriptorPool* pools;
};