// Bad
static int CreateUniformDescription(VkDescriptorPool* pDescPool, VkDescriptorSetLayout* pDescLayout, VkDescriptorSet* pDescSet,
VkDeviceMemory* pDevMemory, VkBuffer* pUniBuffer)
{
// Setup Layout Binding for the Uniform buffer that contains "camera"
VkDescriptorSetLayoutBinding layoutBinding = {};
layoutBinding.binding = 0;
layoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
layoutBinding.descriptorCount = 1;
layoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
// Setup the Description Layout Info
VkDescriptorSetLayoutCreateInfo descLayoutInfo = {};
descLayoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
descLayoutInfo.pBindings = &layoutBinding;
descLayoutInfo.bindingCount = 1;
// Create Description Layout
VkDescriptorSetLayout descLayout = {};
VkResult res = vkCreateDescriptorSetLayout(_VkSystem.device, &descLayoutInfo, 0, &descLayout);
if (res != VK_SUCCESS)
return 1;
// Setup Descriptor Pool Size
VkDescriptorPoolSize descPoolSize = {};
descPoolSize.descriptorCount = 1;
descPoolSize.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
// Setup Descriptor Pool Info
VkDescriptorPoolCreateInfo descPoolInfo = {};
descPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
descPoolInfo.maxSets = 1;
descPoolInfo.poolSizeCount = 1;
descPoolInfo.pPoolSizes = &descPoolSize;
// Create Descriptor Pool
VkDescriptorPool descPool = {};
res = vkCreateDescriptorPool(_VkSystem.device, &descPoolInfo, 0, &descPool);
if (res != VK_SUCCESS)
return 1;
// Setup Descriptor Allocate Info
VkDescriptorSetAllocateInfo allocInfo = {};
allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
allocInfo.descriptorPool = descPool;
allocInfo.pSetLayouts = &descLayout;
allocInfo.descriptorSetCount = 1;
// Allocate Descriptor set/s
VkDescriptorSet descSet = {};
res = vkAllocateDescriptorSets(_VkSystem.device, &allocInfo, &descSet);
if (res != VK_SUCCESS)
return 1;
// Create some random big buffer for the Uniform block
int uniBlockSize = sizeof(float) * 2; // vec2
VkDeviceMemory devMemory2;
VkBuffer uniBuffer;
CreateBuffer(uniBlockSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, &uniBuffer, &devMemory2);
VkMappedMemoryRange range;
void* pBuffer;
vkMapMemory(_VkSystem.device, devMemory2, 0, uniBlockSize, 0, &pBuffer);
((float*)pBuffer)[0] = 0.1f; // x
((float*)pBuffer)[1] = 0.5f; // y
vkUnmapMemory(_VkSystem.device, devMemory2);
// Setup Descriptor Buffer Info
VkDescriptorBufferInfo bufferInfo = {};
bufferInfo.buffer = uniBuffer;
bufferInfo.range = uniBlockSize;
// Setup Write Descriptor Set
VkWriteDescriptorSet writeDescSet = {};
writeDescSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeDescSet.descriptorCount = 1;
writeDescSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
writeDescSet.dstSet = descSet;
writeDescSet.pBufferInfo = &bufferInfo;
// Update Descriptor set/s
vkUpdateDescriptorSets(_VkSystem.device, 1, &writeDescSet, 0, 0);
*pDescLayout = descLayout;
*pDescSet = descSet;
*pDevMemory = devMemory2;
*pUniBuffer = uniBuffer;
*pDescPool = descPool;
return res;
}