summaryrefslogtreecommitdiff
path: root/src/entities.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-09-27 12:51:41 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-27 12:51:41 -0400
commitb14582679d0a113cb8571a7e6764436391d6af48 (patch)
treec3cafdba13af3c29fb135643b48163894cc3ba82 /src/entities.cpp
parentb11ef72f36fa933dd34eb43f53dc15d68ac85ff1 (diff)
checkpoint - EntityType descriptor pool and descriptor sets
Diffstat (limited to 'src/entities.cpp')
-rw-r--r--src/entities.cpp94
1 files changed, 90 insertions, 4 deletions
diff --git a/src/entities.cpp b/src/entities.cpp
index c270be4..1b85784 100644
--- a/src/entities.cpp
+++ b/src/entities.cpp
@@ -579,8 +579,84 @@ void EntityType_Load(EntityType &et) {
}
stbi_image_free(pixels);
- }
+ // descriptor pool & sets
+
+ VkDescriptorPoolSize descriptorPoolSizes[2];
+ descriptorPoolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ descriptorPoolSizes[0].descriptorCount = MAX_FRAMES_IN_FLIGHT;
+ descriptorPoolSizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ descriptorPoolSizes[1].descriptorCount = MAX_FRAMES_IN_FLIGHT;
+
+ VkDescriptorPoolCreateInfo vkDescriptorPoolCreateInfo;
+ vkDescriptorPoolCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
+ vkDescriptorPoolCreateInfo.pNext = nullptr;
+ vkDescriptorPoolCreateInfo.flags = 0;
+ vkDescriptorPoolCreateInfo.maxSets = MAX_FRAMES_IN_FLIGHT;
+ vkDescriptorPoolCreateInfo.poolSizeCount = (uint32_t)2;
+ vkDescriptorPoolCreateInfo.pPoolSizes = descriptorPoolSizes;
+
+ // consider making me a global pool
+ auto vkResult = vkCreateDescriptorPool(vkDevice, &vkDescriptorPoolCreateInfo, vkAllocator, &et.vkDescriptorPool);
+ assert(vkResult == VK_SUCCESS);
+
+ VkDescriptorSetLayout descriptorSets[MAX_FRAMES_IN_FLIGHT];
+ for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
+ descriptorSets[i] = vkDescriptorSetLayout_Texture;
+ }
+ VkDescriptorSetAllocateInfo vkDescriptorSetAllocateInfo;
+ vkDescriptorSetAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
+ vkDescriptorSetAllocateInfo.pNext = nullptr;
+ vkDescriptorSetAllocateInfo.descriptorPool = et.vkDescriptorPool;
+ vkDescriptorSetAllocateInfo.descriptorSetCount = MAX_FRAMES_IN_FLIGHT;
+ vkDescriptorSetAllocateInfo.pSetLayouts = descriptorSets;
+
+ grBinds.vkDescriptorSets = Pke_New<VkDescriptorSet>(MAX_FRAMES_IN_FLIGHT);
+ for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
+ grBinds.vkDescriptorSets[i] = VkDescriptorSet{};
+ }
+ vkResult = vkAllocateDescriptorSets(vkDevice, &vkDescriptorSetAllocateInfo, grBinds.vkDescriptorSets);
+ assert(vkResult == VK_SUCCESS);
+
+ VkWriteDescriptorSet writeDescriptorSets[2 * MAX_FRAMES_IN_FLIGHT];
+ for (long i = 0; i < 2 * MAX_FRAMES_IN_FLIGHT; ++i) {
+ writeDescriptorSets[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ writeDescriptorSets[i].pNext = nullptr;
+ writeDescriptorSets[i].dstSet = nullptr;
+ writeDescriptorSets[i].dstBinding = i % 2;
+ writeDescriptorSets[i].dstArrayElement = 0;
+ writeDescriptorSets[i].descriptorCount = 1;
+ writeDescriptorSets[i].descriptorType = (i % 2) == 0
+ ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER : VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ writeDescriptorSets[i].pImageInfo = nullptr;
+ writeDescriptorSets[i].pBufferInfo = nullptr;
+ writeDescriptorSets[i].pTexelBufferView = nullptr;
+ }
+
+ VkDescriptorImageInfo textureDescriptorInfo;
+ textureDescriptorInfo.sampler = vkSampler_Texture;
+ textureDescriptorInfo.imageView = et.textureImageView;
+ textureDescriptorInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+
+ VkDescriptorBufferInfo vkDescriptorBufferInfo[MAX_FRAMES_IN_FLIGHT];
+
+ for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
+ vkDescriptorBufferInfo[i].buffer = UniformBuffers[i];
+ vkDescriptorBufferInfo[i].offset = 0;
+ vkDescriptorBufferInfo[i].range = sizeof(UniformBufferObject);
+
+ long uboIndex = i * 2;
+ long samplerIndex = uboIndex + 1;
+
+ writeDescriptorSets[uboIndex].pBufferInfo = &vkDescriptorBufferInfo[i];
+ writeDescriptorSets[uboIndex].dstSet = grBinds.vkDescriptorSets[i];
+
+ writeDescriptorSets[samplerIndex].pImageInfo = &textureDescriptorInfo;
+ writeDescriptorSets[samplerIndex].dstSet = grBinds.vkDescriptorSets[i];
+ }
+
+ vkUpdateDescriptorSets(vkDevice, 2 * MAX_FRAMES_IN_FLIGHT, writeDescriptorSets, 0, nullptr);
+ }
// make sure cgltf can interpret our model
for (long i = 0; i < gltfData->accessors_count; ++i) {
@@ -603,7 +679,7 @@ void EntityType_Load(EntityType &et) {
long index = 0;
if (et.Importer_GLTF.AccessorIndexVertex > -1) {
const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexVertex];
- grBinds.vertexCount = acc.count;
+ grBinds.vertexBindingCount = 1;
bufferCI.size = acc.buffer_view->size;
bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.vertexBuffer);
@@ -612,7 +688,7 @@ void EntityType_Load(EntityType &et) {
}
if (et.Importer_GLTF.AccessorIndexNormal > -1) {
const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexNormal];
- grBinds.normalsCount = acc.count;
+ grBinds.normalsBindingCount = 1;
bufferCI.size = acc.buffer_view->size;
vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.normalsBuffer);
@@ -620,7 +696,7 @@ void EntityType_Load(EntityType &et) {
}
if (et.Importer_GLTF.AccessorIndexUV > -1) {
const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexUV];
- grBinds.uvCount = acc.count;
+ grBinds.uvBindingCount = 1;
bufferCI.size = acc.buffer_view->size;
vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.uvBuffer);
@@ -628,6 +704,7 @@ void EntityType_Load(EntityType &et) {
}
if (et.Importer_GLTF.AccessorIndexIndex > -1) {
const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexIndex];
+ grBinds.indexBindingCount = 1;
grBinds.indexCount = acc.count;
bufferCI.size = acc.buffer_view->size;
bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
@@ -818,6 +895,15 @@ void EntityType_Teardown() {
if (GlobalEntityTypes[i].modelFile == nullptr) continue;
auto *et = &GlobalEntityTypes[i];
auto *grBinds = ECS_GetGrBinds(GlobalEntityTypes[i].entityHandle);
+ if (grBinds->vkDescriptorSets != nullptr && et->vkDescriptorPool != VK_NULL_HANDLE) {
+ // 2023-09-27 - JCB
+ // We are not setting the pool flag for allowing freeing descriptor sets
+ // so all we need to do is destroy the pool
+ // If we switch to a global pool, we will need to free here, and
+ // destroy the pool outside of this loop
+ vkDestroyDescriptorPool(vkDevice, et->vkDescriptorPool, vkAllocator);
+ Pke_Delete(grBinds->vkDescriptorSets, MAX_FRAMES_IN_FLIGHT);
+ }
if (grBinds->vertexBuffer != VK_NULL_HANDLE)
vkDestroyBuffer(vkDevice, grBinds->vertexBuffer, vkAllocator);
if (grBinds->normalsBuffer != VK_NULL_HANDLE)