add support for sets within uniforms
This commit is contained in:
@@ -180,9 +180,9 @@ gnReturnCode gnCreateGraphicsPipelineFn(gnGraphicsPipeline graphicsPipeline, gnD
|
||||
.blendConstants[3] = 0.0f
|
||||
};
|
||||
|
||||
graphicsPipeline->graphicsPipeline->setCount = 1;
|
||||
graphicsPipeline->graphicsPipeline->sets = malloc(sizeof(VkDescriptorSetLayout));
|
||||
graphicsPipeline->graphicsPipeline->sets[0] = vkGryphnCreateSetLayouts(&info.uniformLayout, device->outputDevice->device);
|
||||
graphicsPipeline->graphicsPipeline->setCount = info.uniformLayout.setCount;
|
||||
graphicsPipeline->graphicsPipeline->sets = malloc(sizeof(VkDescriptorSetLayout) * info.uniformLayout.setCount);
|
||||
for (int i = 0; i < info.uniformLayout.setCount; i++) graphicsPipeline->graphicsPipeline->sets[i] = vkGryphnCreateSetLayouts(&info.uniformLayout.sets[i], device->outputDevice->device);
|
||||
|
||||
VkPipelineLayoutCreateInfo pipelineLayoutInfo = {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
|
||||
|
@@ -10,26 +10,26 @@ VkDescriptorType vkGryphnUniformType(gnUniformType type) {
|
||||
}
|
||||
|
||||
VkDescriptorSetLayout vkGryphnCreateSetLayouts(
|
||||
const gnUniformLayout* layout,
|
||||
const gnUniformSet* set,
|
||||
VkDevice device
|
||||
) {
|
||||
VkDescriptorSetLayout vkLayout;
|
||||
gnUniformLayout uniformLayout = *layout;
|
||||
gnUniformSet uniformSet = *set;
|
||||
|
||||
VkDescriptorSetLayoutBinding* bindings = malloc(sizeof(VkDescriptorSetLayoutBinding) * uniformLayout.uniformBindingCount);
|
||||
for (int i = 0; i < uniformLayout.uniformBindingCount; i++) {
|
||||
VkDescriptorSetLayoutBinding* bindings = malloc(sizeof(VkDescriptorSetLayoutBinding) * uniformSet.uniformBindingCount);
|
||||
for (int i = 0; i < uniformSet.uniformBindingCount; i++) {
|
||||
bindings[i] = (VkDescriptorSetLayoutBinding){
|
||||
.binding = uniformLayout.uniformBindings[i].binding,
|
||||
.binding = uniformSet.uniformBindings[i].binding,
|
||||
.descriptorCount = 1,
|
||||
.descriptorType = vkGryphnUniformType(uniformLayout.uniformBindings[i].type),
|
||||
.stageFlags = vkGryphnShaderModuleStage(uniformLayout.uniformBindings[i].stage)
|
||||
.descriptorType = vkGryphnUniformType(uniformSet.uniformBindings[i].type),
|
||||
.stageFlags = vkGryphnShaderModuleStage(uniformSet.uniformBindings[i].stage)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
VkDescriptorSetLayoutCreateInfo info = {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
|
||||
.bindingCount = uniformLayout.uniformBindingCount,
|
||||
.bindingCount = uniformSet.uniformBindingCount,
|
||||
.pBindings = bindings
|
||||
};
|
||||
|
||||
|
@@ -2,5 +2,5 @@
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <core/uniforms/gryphn_uniform_layout.h>
|
||||
|
||||
VkDescriptorSetLayout vkGryphnCreateSetLayouts(const gnUniformLayout* layout, VkDevice device);
|
||||
VkDescriptorSetLayout vkGryphnCreateSetLayouts(const gnUniformSet* set, VkDevice device);
|
||||
VkDescriptorType vkGryphnUniformType(gnUniformType type);
|
||||
|
@@ -15,51 +15,22 @@ gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) {
|
||||
return GN_SUCCESS;
|
||||
}
|
||||
|
||||
VkDescriptorSetLayout* fsdfsdfsdfsdfsdfdsf(
|
||||
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;
|
||||
}
|
||||
|
||||
gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, gnUniformAllocationInfo allocInfo) {
|
||||
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 = malloc(sizeof(VkDescriptorSetLayout) * allocInfo.layoutCount);
|
||||
pool->uniformPool->pools[pool->uniformPool->poolCount].layoutCount = allocInfo.layoutCount;
|
||||
pool->uniformPool->pools[pool->uniformPool->poolCount].layouts = malloc(sizeof(VkDescriptorSetLayout) * allocInfo.setCount);
|
||||
pool->uniformPool->pools[pool->uniformPool->poolCount].layoutCount = allocInfo.setCount;
|
||||
VkDescriptorPoolSize uniformBufferSize = {
|
||||
.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||
.descriptorCount = 0
|
||||
};
|
||||
for (int i = 0; i < allocInfo.layoutCount; i++) {
|
||||
for (int c = 0; c < allocInfo.layouts[i].uniformBindingCount; c++)
|
||||
if (allocInfo.layouts[i].uniformBindings[c].type == GN_UNIFORM_BUFFER_DESCRIPTOR) uniformBufferSize.descriptorCount++;
|
||||
pool->uniformPool->pools[pool->uniformPool->poolCount].layouts[i] = vkGryphnCreateSetLayouts(&allocInfo.layouts[i], pool->device->outputDevice->device);
|
||||
for (int i = 0; i < allocInfo.setCount; i++) {
|
||||
for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++)
|
||||
if (allocInfo.sets[i].uniformBindings[c].type == GN_UNIFORM_BUFFER_DESCRIPTOR) uniformBufferSize.descriptorCount++;
|
||||
pool->uniformPool->pools[pool->uniformPool->poolCount].layouts[i] = vkGryphnCreateSetLayouts(&allocInfo.sets[i], pool->device->outputDevice->device);
|
||||
}
|
||||
|
||||
uint32_t maxSets = uniformBufferSize.descriptorCount;
|
||||
@@ -80,16 +51,16 @@ gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, gnUniformAllocati
|
||||
VkDescriptorSetAllocateInfo vkAllocInfo = {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
|
||||
.descriptorPool = pool->uniformPool->pools[pool->uniformPool->poolCount].pool,
|
||||
.descriptorSetCount = allocInfo.layoutCount,
|
||||
.descriptorSetCount = allocInfo.setCount,
|
||||
.pSetLayouts = pool->uniformPool->pools[pool->uniformPool->poolCount].layouts
|
||||
};
|
||||
|
||||
VkDescriptorSet* sets = malloc(sizeof(VkDescriptorSet) * allocInfo.layoutCount);
|
||||
VkDescriptorSet* sets = malloc(sizeof(VkDescriptorSet) * allocInfo.setCount);
|
||||
if (vkAllocateDescriptorSets(pool->device->outputDevice->device, &vkAllocInfo, sets) != VK_SUCCESS)
|
||||
return NULL;
|
||||
|
||||
gnUniform* uniforms = malloc(sizeof(gnUniform) * allocInfo.layoutCount);
|
||||
for (int i = 0; i < allocInfo.layoutCount; i++) {
|
||||
gnUniform* uniforms = malloc(sizeof(gnUniform) * allocInfo.setCount);
|
||||
for (int i = 0; i < allocInfo.setCount; i++) {
|
||||
uniforms[i] = malloc(sizeof(struct gnUniform_t));
|
||||
uniforms[i]->uniform = malloc(sizeof(struct gnPlatformUniform_t));
|
||||
uniforms[i]->uniform->set = sets[i];
|
||||
|
@@ -89,6 +89,7 @@ typedef struct gnGraphicsPipelineInfo_t {
|
||||
uint32_t shaderModuleCount;
|
||||
gnShaderModuleHandle* shaderModules;
|
||||
gnShaderInputLayout shaderInputLayout;
|
||||
|
||||
gnUniformLayout uniformLayout;
|
||||
} gnGraphicsPipelineInfo;
|
||||
|
||||
|
@@ -14,7 +14,12 @@ typedef struct gnUniformBinding {
|
||||
gnShaderModuleStage stage;
|
||||
} gnUniformBinding;
|
||||
|
||||
typedef struct gnUniformLayout {
|
||||
typedef struct gnUniformSet {
|
||||
uint32_t uniformBindingCount;
|
||||
gnUniformBinding* uniformBindings;
|
||||
} gnUniformSet;
|
||||
|
||||
typedef struct gnUniformLayout {
|
||||
uint32_t setCount;
|
||||
gnUniformSet* sets;
|
||||
} gnUniformLayout;
|
||||
|
@@ -13,12 +13,12 @@ gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device) {
|
||||
// you own this memory now
|
||||
gnUniformArrayList gnUniformPoolAllocateUniforms(gnUniformPool pool, gnUniformAllocationInfo allocInfo) {
|
||||
gnUniform* uniforms = pool->device->deviceFunctions->_gnUniformPoolAllocateUniforms(pool, allocInfo);
|
||||
for (int i = 0; i < allocInfo.layoutCount; i++)
|
||||
for (int i = 0; i < allocInfo.setCount; i++)
|
||||
uniforms[i]->pool = pool;
|
||||
|
||||
gnUniformArrayList list = gnUniformArrayListCreate();
|
||||
gnUniformArrayListResize(&list, allocInfo.layoutCount);
|
||||
for (int i = 0; i < allocInfo.layoutCount; i++) list.data[i] = uniforms[i];
|
||||
gnUniformArrayListResize(&list, allocInfo.setCount);
|
||||
for (int i = 0; i < allocInfo.setCount; i++) list.data[i] = uniforms[i];
|
||||
return list;
|
||||
}
|
||||
|
||||
|
@@ -12,8 +12,8 @@ struct gnUniformPool_t {
|
||||
#endif
|
||||
|
||||
typedef struct gnUniformAllocationInfo {
|
||||
const uint32_t layoutCount;
|
||||
const gnUniformLayout* layouts;
|
||||
const uint32_t setCount;
|
||||
const gnUniformSet* sets;
|
||||
} gnUniformAllocationInfo;
|
||||
|
||||
gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device);
|
||||
|
Reference in New Issue
Block a user