summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/entities.cpp322
-rw-r--r--src/window.cpp317
-rw-r--r--src/window.hpp14
3 files changed, 333 insertions, 320 deletions
diff --git a/src/entities.cpp b/src/entities.cpp
index d98d49b..84a9110 100644
--- a/src/entities.cpp
+++ b/src/entities.cpp
@@ -2,312 +2,8 @@
#include "entities.hpp"
DynArray<EntityType> GlobalEntityTypes{16};
-VkDescriptorSetLayout vkDescriptorSetLayout_Texture = VK_NULL_HANDLE;
-VkPipelineLayout vkPipelineLayout_Texture = VK_NULL_HANDLE;
-VkSampler vkSampler_Texture = VK_NULL_HANDLE;
-struct ImplementedPipelines {
- union {
- VkPipeline pipelines[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
- struct {
- VkPipeline Texture;
- VkPipeline TextureWireframe;
- };
- };
-} vkPipelines;
void EntityType_Init() {
- VkDescriptorSetLayoutBinding vkDescriptorSetLayoutBindings[2];
- for (long i = 0; i < 2; ++i) {
- vkDescriptorSetLayoutBindings[i].pImmutableSamplers = nullptr;
- }
- vkDescriptorSetLayoutBindings[0].binding = 0;
- vkDescriptorSetLayoutBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
- vkDescriptorSetLayoutBindings[0].descriptorCount = 1;
- vkDescriptorSetLayoutBindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
- vkDescriptorSetLayoutBindings[1].binding = 1;
- vkDescriptorSetLayoutBindings[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
- vkDescriptorSetLayoutBindings[1].descriptorCount = 1;
- vkDescriptorSetLayoutBindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
- VkDescriptorSetLayoutCreateInfo vkDescriptorSetLayoutCreateInfo {
- .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0,
- .bindingCount = 2,
- .pBindings = vkDescriptorSetLayoutBindings,
- };
- vkCreateDescriptorSetLayout(vkDevice, &vkDescriptorSetLayoutCreateInfo, vkAllocator, &vkDescriptorSetLayout_Texture);
-
- VkPipelineLayoutCreateInfo vkPipelineLayoutCreateInfo {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0,
- .setLayoutCount = 1,
- .pSetLayouts = &vkDescriptorSetLayout_Texture,
- .pushConstantRangeCount = 0,
- .pPushConstantRanges = nullptr,
- };
- vkCreatePipelineLayout(vkDevice, &vkPipelineLayoutCreateInfo, vkAllocator, &vkPipelineLayout_Texture);
-
- VkSamplerCreateInfo vkSamplerCreateInfo;
- vkSamplerCreateInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
- vkSamplerCreateInfo.pNext = nullptr;
- vkSamplerCreateInfo.flags = 0;
- vkSamplerCreateInfo.magFilter = VK_FILTER_NEAREST;
- vkSamplerCreateInfo.minFilter = VK_FILTER_NEAREST;
- vkSamplerCreateInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
- vkSamplerCreateInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
- vkSamplerCreateInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
- vkSamplerCreateInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
- vkSamplerCreateInfo.mipLodBias = 0.0f;
- vkSamplerCreateInfo.anisotropyEnable = VK_TRUE;
- vkSamplerCreateInfo.maxAnisotropy = vkPhysicalDeviceProperties.limits.maxSamplerAnisotropy;
- vkSamplerCreateInfo.compareEnable = VK_FALSE;
- vkSamplerCreateInfo.compareOp = VK_COMPARE_OP_ALWAYS;
- vkSamplerCreateInfo.minLod = 0.0f;
- // TODO MipMap
- vkSamplerCreateInfo.maxLod = 1;
- vkSamplerCreateInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK;
- vkSamplerCreateInfo.unnormalizedCoordinates = VK_FALSE;
- vkCreateSampler(vkDevice, &vkSamplerCreateInfo, vkAllocator, &vkSampler_Texture);
-
- // pipelines
- {
- const long vertexBindingCount = 4;
- long index = 0;
- VkVertexInputBindingDescription vertInputBD[vertexBindingCount];
- // model vertex
- vertInputBD[index].binding = index;
- vertInputBD[index].stride = sizeof(glm::vec3);
- vertInputBD[index].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
- index += 1;
- // model normals
- vertInputBD[index].binding = index;
- vertInputBD[index].stride = sizeof(glm::vec3);
- vertInputBD[index].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
- index += 1;
- // model UV
- vertInputBD[index].binding = index;
- vertInputBD[index].stride = sizeof(glm::vec2);
- vertInputBD[index].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
- index += 1;
- // model index
- // vertInputBD[index].binding = index;
- // vertInputBD[index].stride = sizeof(uint16_t);
- // vertInputBD[index].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
- // index += 1;
- // instance
- vertInputBD[index].binding = index;
- vertInputBD[index].stride = sizeof(glm::mat4);
- vertInputBD[index].inputRate = VK_VERTEX_INPUT_RATE_INSTANCE;
-
- const long vertexAttrDescCount = 7;
- index = 0;
- VkVertexInputAttributeDescription vertAttrDesc[vertexAttrDescCount];
- for (long i = 0; i < vertexAttrDescCount; ++i) {
- vertAttrDesc[i].location = i;
- }
-
- // model vertex
- vertAttrDesc[index].binding = 0;
- vertAttrDesc[index].format = VK_FORMAT_R32G32B32_SFLOAT;
- vertAttrDesc[index].offset = 0;
- index += 1;
-
- // model normals
- vertAttrDesc[index].binding = 1;
- vertAttrDesc[index].format = VK_FORMAT_R32G32B32_SFLOAT;
- vertAttrDesc[index].offset = 0;
- index += 1;
-
- // model UV
- vertAttrDesc[index].binding = 2;
- vertAttrDesc[index].format = VK_FORMAT_R32G32_SFLOAT;
- vertAttrDesc[index].offset = 0;
- index += 1;
-
- // instPosRotScale
- for (long i = 0; i < 4; ++i) {
- vertAttrDesc[index].binding = 3;
- vertAttrDesc[index].format = VK_FORMAT_R32G32B32A32_SFLOAT;
- vertAttrDesc[index].offset = sizeof(glm::vec4) * i;
- index += 1;
- }
-
- // instance texture index
- // vertAttrDesc[index].binding = 3;
- // vertAttrDesc[index].format = VK_FORMAT_R32_SFLOAT;
- // vertAttrDesc[index].offset = runningOffset;
- // runningOffset += sizeof(float);
- // index += 1;
-
- VkPipelineVertexInputStateCreateInfo vkPipelineVertexInputStateCreateInfo;
- vkPipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
- vkPipelineVertexInputStateCreateInfo.pNext = nullptr;
- vkPipelineVertexInputStateCreateInfo.flags = {};
- vkPipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = vertexBindingCount;
- vkPipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = vertInputBD;
- vkPipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = vertexAttrDescCount;
- vkPipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = vertAttrDesc;
-
- VkPipelineInputAssemblyStateCreateInfo vkPipelineInputAssemblyStateCreateInfo;
- vkPipelineInputAssemblyStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
- vkPipelineInputAssemblyStateCreateInfo.pNext = nullptr;
- vkPipelineInputAssemblyStateCreateInfo.flags = {};
- vkPipelineInputAssemblyStateCreateInfo.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
- vkPipelineInputAssemblyStateCreateInfo.primitiveRestartEnable = VK_FALSE;
-
- // TODO - is this right? set to dynamic later
- VkPipelineViewportStateCreateInfo vkPipelineViewportStateCreateInfo;
- vkPipelineViewportStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
- vkPipelineViewportStateCreateInfo.pNext = nullptr;
- vkPipelineViewportStateCreateInfo.flags = {};
- vkPipelineViewportStateCreateInfo.viewportCount = 1;
- vkPipelineViewportStateCreateInfo.pViewports = nullptr;
- vkPipelineViewportStateCreateInfo.scissorCount = 1;
- vkPipelineViewportStateCreateInfo.pScissors = nullptr;
-
- VkPipelineRasterizationStateCreateInfo vkPipelineRasterizationStateCreateInfoFill;
- vkPipelineRasterizationStateCreateInfoFill.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
- vkPipelineRasterizationStateCreateInfoFill.pNext = nullptr;
- vkPipelineRasterizationStateCreateInfoFill.flags = {};
- vkPipelineRasterizationStateCreateInfoFill.depthClampEnable = VK_FALSE;
- vkPipelineRasterizationStateCreateInfoFill.rasterizerDiscardEnable = VK_FALSE;
- vkPipelineRasterizationStateCreateInfoFill.polygonMode = VK_POLYGON_MODE_FILL;
- vkPipelineRasterizationStateCreateInfoFill.cullMode = VK_CULL_MODE_BACK_BIT;
- vkPipelineRasterizationStateCreateInfoFill.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
- vkPipelineRasterizationStateCreateInfoFill.depthBiasEnable = VK_FALSE;
- vkPipelineRasterizationStateCreateInfoFill.depthBiasConstantFactor = 0.0f;
- vkPipelineRasterizationStateCreateInfoFill.depthBiasClamp = 0.0f;
- vkPipelineRasterizationStateCreateInfoFill.depthBiasSlopeFactor = 0.0f;
- vkPipelineRasterizationStateCreateInfoFill.lineWidth = 1.0f;
-
- VkPipelineRasterizationStateCreateInfo vkPipelineRasterizationStateCreateInfoLine{vkPipelineRasterizationStateCreateInfoFill};
- vkPipelineRasterizationStateCreateInfoLine.polygonMode = VK_POLYGON_MODE_LINE;
-
- VkPipelineMultisampleStateCreateInfo vkPipelineMultisampleStateCreateInfo;
- vkPipelineMultisampleStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
- vkPipelineMultisampleStateCreateInfo.pNext = nullptr;
- vkPipelineMultisampleStateCreateInfo.flags = 0;
- vkPipelineMultisampleStateCreateInfo.rasterizationSamples = renderSampleCount;
- vkPipelineMultisampleStateCreateInfo.sampleShadingEnable = VK_FALSE;
- vkPipelineMultisampleStateCreateInfo.minSampleShading = 0.0f;
- vkPipelineMultisampleStateCreateInfo.pSampleMask = nullptr;
- vkPipelineMultisampleStateCreateInfo.alphaToCoverageEnable = VK_FALSE;
- vkPipelineMultisampleStateCreateInfo.alphaToOneEnable = VK_FALSE;
-
- // TODO Transparency
- VkPipelineColorBlendAttachmentState vkPipelineColorBlendAttachmentState[1];
- vkPipelineColorBlendAttachmentState[0].blendEnable = VK_FALSE;
- vkPipelineColorBlendAttachmentState[0].srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
- vkPipelineColorBlendAttachmentState[0].dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
- vkPipelineColorBlendAttachmentState[0].colorBlendOp = VK_BLEND_OP_ADD;
- vkPipelineColorBlendAttachmentState[0].srcAlphaBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
- vkPipelineColorBlendAttachmentState[0].dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
- vkPipelineColorBlendAttachmentState[0].alphaBlendOp = VK_BLEND_OP_SUBTRACT;
- vkPipelineColorBlendAttachmentState[0].colorWriteMask =
- VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |
- VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
-
- VkPipelineColorBlendStateCreateInfo vkPipelineColorBlendStateCreateInfo;
- vkPipelineColorBlendStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
- vkPipelineColorBlendStateCreateInfo.pNext = nullptr;
- vkPipelineColorBlendStateCreateInfo.flags = {};
- vkPipelineColorBlendStateCreateInfo.logicOpEnable = VK_FALSE;
- vkPipelineColorBlendStateCreateInfo.logicOp = VK_LOGIC_OP_COPY;
- vkPipelineColorBlendStateCreateInfo.attachmentCount = 1;
- vkPipelineColorBlendStateCreateInfo.pAttachments = vkPipelineColorBlendAttachmentState;
- vkPipelineColorBlendStateCreateInfo.blendConstants[0] = 0.0f;
- vkPipelineColorBlendStateCreateInfo.blendConstants[1] = 0.0f;
- vkPipelineColorBlendStateCreateInfo.blendConstants[2] = 0.0f;
- vkPipelineColorBlendStateCreateInfo.blendConstants[3] = 0.0f;
-
- VkDynamicState dynamicStates[2] = { VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_VIEWPORT };
- VkPipelineDynamicStateCreateInfo vkPipelineDynamicStateCreateInfo;
- vkPipelineDynamicStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
- vkPipelineDynamicStateCreateInfo.pNext = nullptr;
- vkPipelineDynamicStateCreateInfo.flags = {};
- vkPipelineDynamicStateCreateInfo.dynamicStateCount = 2;
- vkPipelineDynamicStateCreateInfo.pDynamicStates = dynamicStates;
-
- VkPipelineDepthStencilStateCreateInfo vkPipelineDepthStencilStateCreateInfo;
- vkPipelineDepthStencilStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
- vkPipelineDepthStencilStateCreateInfo.pNext = nullptr;
- vkPipelineDepthStencilStateCreateInfo.flags = {};
- vkPipelineDepthStencilStateCreateInfo.depthTestEnable = VK_TRUE;
- vkPipelineDepthStencilStateCreateInfo.depthWriteEnable = VK_TRUE;
- vkPipelineDepthStencilStateCreateInfo.depthCompareOp = VK_COMPARE_OP_LESS;
- vkPipelineDepthStencilStateCreateInfo.depthBoundsTestEnable = VK_FALSE;
- vkPipelineDepthStencilStateCreateInfo.stencilTestEnable = VK_FALSE;
- vkPipelineDepthStencilStateCreateInfo.front = {};
- vkPipelineDepthStencilStateCreateInfo.back = {};
- vkPipelineDepthStencilStateCreateInfo.minDepthBounds = {};
- vkPipelineDepthStencilStateCreateInfo.maxDepthBounds = {};
-
- AssetHandle vertShaderAssetHandle = AM_Register("assets/shaders/vert.vert.spv");
- AssetHandle textureFragShaderAssetHandle = AM_Register("assets/shaders/texture.frag.spv");
- const Asset *vertShaderAsset = AM_Get(vertShaderAssetHandle);
- const Asset *fragShaderAsset = AM_Get(textureFragShaderAssetHandle);
- VkShaderModuleCreateInfo vkShaderModuleCreateInfo[2];
- vkShaderModuleCreateInfo[0].codeSize = vertShaderAsset->size;
- vkShaderModuleCreateInfo[0].pCode = reinterpret_cast<const uint32_t *>(vertShaderAsset->ptr);
- vkShaderModuleCreateInfo[1].codeSize = fragShaderAsset->size;
- vkShaderModuleCreateInfo[1].pCode = reinterpret_cast<const uint32_t *>(fragShaderAsset->ptr);
- VkShaderModule shaderModules[2];
-
- VkPipelineShaderStageCreateInfo vkPipelineShaderStageCreateInfo[2];
- for (long i = 0; i < 2; ++i) {
- vkShaderModuleCreateInfo[i].sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
- vkShaderModuleCreateInfo[i].pNext = nullptr;
- vkShaderModuleCreateInfo[i].flags = {};
- vkPipelineShaderStageCreateInfo[i].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- vkPipelineShaderStageCreateInfo[i].pNext = nullptr;
- vkPipelineShaderStageCreateInfo[i].flags = {};
- vkPipelineShaderStageCreateInfo[i].pName = "main";
- vkPipelineShaderStageCreateInfo[i].pSpecializationInfo = nullptr;
-
- vkCreateShaderModule(vkDevice, &vkShaderModuleCreateInfo[i], vkAllocator, &shaderModules[i]);
- }
-
- vkPipelineShaderStageCreateInfo[0].module = shaderModules[0];
- vkPipelineShaderStageCreateInfo[1].module = shaderModules[1];
- vkPipelineShaderStageCreateInfo[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
- vkPipelineShaderStageCreateInfo[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
-
- VkGraphicsPipelineCreateInfo vkGraphicsPipelineCreateInfo[2];
- for (long i = 0; i < 2; ++i) {
- vkGraphicsPipelineCreateInfo[i].sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
- vkGraphicsPipelineCreateInfo[i].pNext = nullptr;
- vkGraphicsPipelineCreateInfo[i].flags = {};
- vkGraphicsPipelineCreateInfo[i].stageCount = 2;
- vkGraphicsPipelineCreateInfo[i].pStages = vkPipelineShaderStageCreateInfo;
- vkGraphicsPipelineCreateInfo[i].pVertexInputState = &vkPipelineVertexInputStateCreateInfo;
- vkGraphicsPipelineCreateInfo[i].pInputAssemblyState = &vkPipelineInputAssemblyStateCreateInfo;
- vkGraphicsPipelineCreateInfo[i].pTessellationState = nullptr;
- vkGraphicsPipelineCreateInfo[i].pViewportState = &vkPipelineViewportStateCreateInfo;
- vkGraphicsPipelineCreateInfo[i].pMultisampleState = &vkPipelineMultisampleStateCreateInfo;
- vkGraphicsPipelineCreateInfo[i].pDepthStencilState = &vkPipelineDepthStencilStateCreateInfo;
- vkGraphicsPipelineCreateInfo[i].pColorBlendState = &vkPipelineColorBlendStateCreateInfo;
- vkGraphicsPipelineCreateInfo[i].pDynamicState = &vkPipelineDynamicStateCreateInfo;
- vkGraphicsPipelineCreateInfo[i].layout = vkPipelineLayout_Texture;
- vkGraphicsPipelineCreateInfo[i].renderPass = renderRenderPass;
- vkGraphicsPipelineCreateInfo[i].subpass = 0;
- vkGraphicsPipelineCreateInfo[i].basePipelineHandle = VK_NULL_HANDLE;
- vkGraphicsPipelineCreateInfo[i].basePipelineIndex = {};
- }
-
- vkGraphicsPipelineCreateInfo[0].pRasterizationState = &vkPipelineRasterizationStateCreateInfoFill;
- vkGraphicsPipelineCreateInfo[1].pRasterizationState = &vkPipelineRasterizationStateCreateInfoLine;
-
- vkCreateGraphicsPipelines(vkDevice, VK_NULL_HANDLE, 2, vkGraphicsPipelineCreateInfo, vkAllocator, vkPipelines.pipelines);
-
- for (long i = 0; i < 2; ++i) {
- vkDestroyShaderModule(vkDevice, shaderModules[i], vkAllocator);
- }
-
- AM_Destroy(textureFragShaderAssetHandle);
- AM_Destroy(vertShaderAssetHandle);
- }
-
long entityTypeCount = GlobalEntityTypes.Count();
for (long i = 0; i < entityTypeCount; ++i) {
EntityType_Load(GlobalEntityTypes[i]);
@@ -339,8 +35,8 @@ void EntityType_Load(EntityType &et) {
* I don't like that we're just copying this.
* This should be moved to window.cpp.
*/
- grBinds.vkPipelineLayout = vkPipelineLayout_Texture;
- grBinds.graphicsPipeline = vkPipelines.Texture;
+ grBinds.vkPipelineLayout = pkePipelines.vkPipelineLayout_Texture;
+ grBinds.graphicsPipeline = pkePipelines.pipelines.Texture;
et.grBindsHandle = grBinds.grBindsHandle;
cgltf_options options{};
@@ -587,7 +283,7 @@ void EntityType_Load(EntityType &et) {
VkDescriptorSetLayout descriptorSets[MAX_FRAMES_IN_FLIGHT];
for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
- descriptorSets[i] = vkDescriptorSetLayout_Texture;
+ descriptorSets[i] = pkePipelines.vkDescriptorSetLayout_Texture;
}
VkDescriptorSetAllocateInfo vkDescriptorSetAllocateInfo;
vkDescriptorSetAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
@@ -619,7 +315,7 @@ void EntityType_Load(EntityType &et) {
}
VkDescriptorImageInfo textureDescriptorInfo;
- textureDescriptorInfo.sampler = vkSampler_Texture;
+ textureDescriptorInfo.sampler = pkePipelines.vkSampler_Texture;
textureDescriptorInfo.imageView = et.textureImageView;
textureDescriptorInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
@@ -951,15 +647,5 @@ void EntityType_Teardown() {
if (et->entityTypeCode)
Pke_Delete<char>(et->entityTypeCode, strlen(et->entityTypeCode));
}
- if (vkSampler_Texture != VK_NULL_HANDLE)
- vkDestroySampler(vkDevice, vkSampler_Texture, vkAllocator);
- for (long i = 0; i < 2; ++i) {
- if (vkPipelines.pipelines[i] != VK_NULL_HANDLE)
- vkDestroyPipeline(vkDevice, vkPipelines.pipelines[i], vkAllocator);
- }
- if (vkPipelineLayout_Texture != VK_NULL_HANDLE)
- vkDestroyPipelineLayout(vkDevice, vkPipelineLayout_Texture, vkAllocator);
- if (vkDescriptorSetLayout_Texture != VK_NULL_HANDLE)
- vkDestroyDescriptorSetLayout(vkDevice, vkDescriptorSetLayout_Texture, vkAllocator);
GlobalEntityTypes.~DynArray();
}
diff --git a/src/window.cpp b/src/window.cpp
index 857e6e9..58dcdb1 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -81,8 +81,10 @@ UniformBufferObject UBO{
.proj = glm::mat4(1),
};
VkDeviceMemory uniformBufferMemory;
+
// public
VkBuffer UniformBuffers[MAX_FRAMES_IN_FLIGHT];
+ImplementedPipelines pkePipelines{};
/*
* ImGui
@@ -863,7 +865,7 @@ void CreateRenderPass() {
}
}
-void CreateGraphicsPipeline() {
+void CreateGraphicsPipelines() {
AssetHandle vertShaderAsset = AM_Register("assets/shaders/present.vert.spv");
AssetHandle fragShaderAsset = AM_Register("assets/shaders/present.frag.spv");
auto vertShader = UploadShader(vertShaderAsset);
@@ -1094,6 +1096,305 @@ void CreateGraphicsPipeline() {
vkDestroyShaderModule(vkDevice, vertShader, vkAllocator);
AM_Destroy(fragShaderAsset);
AM_Destroy(vertShaderAsset);
+
+ /*
+ * Texture & Debug pipelines
+ */
+
+ // layouts
+ {
+ VkDescriptorSetLayoutBinding vkDescriptorSetLayoutBindings[2];
+ for (long i = 0; i < 2; ++i) {
+ vkDescriptorSetLayoutBindings[i].pImmutableSamplers = nullptr;
+ }
+ vkDescriptorSetLayoutBindings[0].binding = 0;
+ vkDescriptorSetLayoutBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ vkDescriptorSetLayoutBindings[0].descriptorCount = 1;
+ vkDescriptorSetLayoutBindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
+ vkDescriptorSetLayoutBindings[1].binding = 1;
+ vkDescriptorSetLayoutBindings[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ vkDescriptorSetLayoutBindings[1].descriptorCount = 1;
+ vkDescriptorSetLayoutBindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
+ VkDescriptorSetLayoutCreateInfo vkDescriptorSetLayoutCreateInfo {
+ .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0,
+ .bindingCount = 2,
+ .pBindings = vkDescriptorSetLayoutBindings,
+ };
+ vkCreateDescriptorSetLayout(vkDevice, &vkDescriptorSetLayoutCreateInfo, vkAllocator, &pkePipelines.vkDescriptorSetLayout_Texture);
+
+ VkPipelineLayoutCreateInfo vkPipelineLayoutCreateInfo {
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0,
+ .setLayoutCount = 1,
+ .pSetLayouts = &pkePipelines.vkDescriptorSetLayout_Texture,
+ .pushConstantRangeCount = 0,
+ .pPushConstantRanges = nullptr,
+ };
+ vkCreatePipelineLayout(vkDevice, &vkPipelineLayoutCreateInfo, vkAllocator, &pkePipelines.vkPipelineLayout_Texture);
+
+ VkSamplerCreateInfo vkSamplerCreateInfo;
+ vkSamplerCreateInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
+ vkSamplerCreateInfo.pNext = nullptr;
+ vkSamplerCreateInfo.flags = 0;
+ vkSamplerCreateInfo.magFilter = VK_FILTER_NEAREST;
+ vkSamplerCreateInfo.minFilter = VK_FILTER_NEAREST;
+ vkSamplerCreateInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
+ vkSamplerCreateInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+ vkSamplerCreateInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+ vkSamplerCreateInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+ vkSamplerCreateInfo.mipLodBias = 0.0f;
+ vkSamplerCreateInfo.anisotropyEnable = VK_TRUE;
+ vkSamplerCreateInfo.maxAnisotropy = vkPhysicalDeviceProperties.limits.maxSamplerAnisotropy;
+ vkSamplerCreateInfo.compareEnable = VK_FALSE;
+ vkSamplerCreateInfo.compareOp = VK_COMPARE_OP_ALWAYS;
+ vkSamplerCreateInfo.minLod = 0.0f;
+ // TODO MipMap
+ vkSamplerCreateInfo.maxLod = 1;
+ vkSamplerCreateInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK;
+ vkSamplerCreateInfo.unnormalizedCoordinates = VK_FALSE;
+ vkCreateSampler(vkDevice, &vkSamplerCreateInfo, vkAllocator, &pkePipelines.vkSampler_Texture);
+ }
+
+ // pipelines
+ {
+ const long vertexBindingCount = 4;
+ long index = 0;
+ VkVertexInputBindingDescription vertInputBD[vertexBindingCount];
+ // model vertex
+ vertInputBD[index].binding = index;
+ vertInputBD[index].stride = sizeof(glm::vec3);
+ vertInputBD[index].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
+ index += 1;
+ // model normals
+ vertInputBD[index].binding = index;
+ vertInputBD[index].stride = sizeof(glm::vec3);
+ vertInputBD[index].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
+ index += 1;
+ // model UV
+ vertInputBD[index].binding = index;
+ vertInputBD[index].stride = sizeof(glm::vec2);
+ vertInputBD[index].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
+ index += 1;
+ // model index
+ // vertInputBD[index].binding = index;
+ // vertInputBD[index].stride = sizeof(uint16_t);
+ // vertInputBD[index].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
+ // index += 1;
+ // instance
+ vertInputBD[index].binding = index;
+ vertInputBD[index].stride = sizeof(glm::mat4);
+ vertInputBD[index].inputRate = VK_VERTEX_INPUT_RATE_INSTANCE;
+
+ const long vertexAttrDescCount = 7;
+ index = 0;
+ VkVertexInputAttributeDescription vertAttrDesc[vertexAttrDescCount];
+ for (long i = 0; i < vertexAttrDescCount; ++i) {
+ vertAttrDesc[i].location = i;
+ }
+
+ // model vertex
+ vertAttrDesc[index].binding = 0;
+ vertAttrDesc[index].format = VK_FORMAT_R32G32B32_SFLOAT;
+ vertAttrDesc[index].offset = 0;
+ index += 1;
+
+ // model normals
+ vertAttrDesc[index].binding = 1;
+ vertAttrDesc[index].format = VK_FORMAT_R32G32B32_SFLOAT;
+ vertAttrDesc[index].offset = 0;
+ index += 1;
+
+ // model UV
+ vertAttrDesc[index].binding = 2;
+ vertAttrDesc[index].format = VK_FORMAT_R32G32_SFLOAT;
+ vertAttrDesc[index].offset = 0;
+ index += 1;
+
+ // instPosRotScale
+ for (long i = 0; i < 4; ++i) {
+ vertAttrDesc[index].binding = 3;
+ vertAttrDesc[index].format = VK_FORMAT_R32G32B32A32_SFLOAT;
+ vertAttrDesc[index].offset = sizeof(glm::vec4) * i;
+ index += 1;
+ }
+
+ // instance texture index
+ // vertAttrDesc[index].binding = 3;
+ // vertAttrDesc[index].format = VK_FORMAT_R32_SFLOAT;
+ // vertAttrDesc[index].offset = runningOffset;
+ // runningOffset += sizeof(float);
+ // index += 1;
+
+ VkPipelineVertexInputStateCreateInfo vkPipelineVertexInputStateCreateInfo;
+ vkPipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
+ vkPipelineVertexInputStateCreateInfo.pNext = nullptr;
+ vkPipelineVertexInputStateCreateInfo.flags = {};
+ vkPipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = vertexBindingCount;
+ vkPipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = vertInputBD;
+ vkPipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = vertexAttrDescCount;
+ vkPipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = vertAttrDesc;
+
+ VkPipelineInputAssemblyStateCreateInfo vkPipelineInputAssemblyStateCreateInfo;
+ vkPipelineInputAssemblyStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
+ vkPipelineInputAssemblyStateCreateInfo.pNext = nullptr;
+ vkPipelineInputAssemblyStateCreateInfo.flags = {};
+ vkPipelineInputAssemblyStateCreateInfo.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+ vkPipelineInputAssemblyStateCreateInfo.primitiveRestartEnable = VK_FALSE;
+
+ // TODO - is this right? set to dynamic later
+ VkPipelineViewportStateCreateInfo vkPipelineViewportStateCreateInfo;
+ vkPipelineViewportStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
+ vkPipelineViewportStateCreateInfo.pNext = nullptr;
+ vkPipelineViewportStateCreateInfo.flags = {};
+ vkPipelineViewportStateCreateInfo.viewportCount = 1;
+ vkPipelineViewportStateCreateInfo.pViewports = nullptr;
+ vkPipelineViewportStateCreateInfo.scissorCount = 1;
+ vkPipelineViewportStateCreateInfo.pScissors = nullptr;
+
+ VkPipelineRasterizationStateCreateInfo vkPipelineRasterizationStateCreateInfoFill;
+ vkPipelineRasterizationStateCreateInfoFill.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
+ vkPipelineRasterizationStateCreateInfoFill.pNext = nullptr;
+ vkPipelineRasterizationStateCreateInfoFill.flags = {};
+ vkPipelineRasterizationStateCreateInfoFill.depthClampEnable = VK_FALSE;
+ vkPipelineRasterizationStateCreateInfoFill.rasterizerDiscardEnable = VK_FALSE;
+ vkPipelineRasterizationStateCreateInfoFill.polygonMode = VK_POLYGON_MODE_FILL;
+ vkPipelineRasterizationStateCreateInfoFill.cullMode = VK_CULL_MODE_BACK_BIT;
+ vkPipelineRasterizationStateCreateInfoFill.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
+ vkPipelineRasterizationStateCreateInfoFill.depthBiasEnable = VK_FALSE;
+ vkPipelineRasterizationStateCreateInfoFill.depthBiasConstantFactor = 0.0f;
+ vkPipelineRasterizationStateCreateInfoFill.depthBiasClamp = 0.0f;
+ vkPipelineRasterizationStateCreateInfoFill.depthBiasSlopeFactor = 0.0f;
+ vkPipelineRasterizationStateCreateInfoFill.lineWidth = 1.0f;
+
+ VkPipelineRasterizationStateCreateInfo vkPipelineRasterizationStateCreateInfoLine{vkPipelineRasterizationStateCreateInfoFill};
+ vkPipelineRasterizationStateCreateInfoLine.cullMode = VK_CULL_MODE_NONE;
+ vkPipelineRasterizationStateCreateInfoLine.polygonMode = VK_POLYGON_MODE_LINE;
+
+ VkPipelineMultisampleStateCreateInfo vkPipelineMultisampleStateCreateInfo;
+ vkPipelineMultisampleStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
+ vkPipelineMultisampleStateCreateInfo.pNext = nullptr;
+ vkPipelineMultisampleStateCreateInfo.flags = 0;
+ vkPipelineMultisampleStateCreateInfo.rasterizationSamples = renderSampleCount;
+ vkPipelineMultisampleStateCreateInfo.sampleShadingEnable = VK_FALSE;
+ vkPipelineMultisampleStateCreateInfo.minSampleShading = 0.0f;
+ vkPipelineMultisampleStateCreateInfo.pSampleMask = nullptr;
+ vkPipelineMultisampleStateCreateInfo.alphaToCoverageEnable = VK_FALSE;
+ vkPipelineMultisampleStateCreateInfo.alphaToOneEnable = VK_FALSE;
+
+ // TODO Transparency
+ VkPipelineColorBlendAttachmentState vkPipelineColorBlendAttachmentState[1];
+ vkPipelineColorBlendAttachmentState[0].blendEnable = VK_FALSE;
+ vkPipelineColorBlendAttachmentState[0].srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
+ vkPipelineColorBlendAttachmentState[0].dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
+ vkPipelineColorBlendAttachmentState[0].colorBlendOp = VK_BLEND_OP_ADD;
+ vkPipelineColorBlendAttachmentState[0].srcAlphaBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
+ vkPipelineColorBlendAttachmentState[0].dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
+ vkPipelineColorBlendAttachmentState[0].alphaBlendOp = VK_BLEND_OP_SUBTRACT;
+ vkPipelineColorBlendAttachmentState[0].colorWriteMask =
+ VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |
+ VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+
+ VkPipelineColorBlendStateCreateInfo vkPipelineColorBlendStateCreateInfo;
+ vkPipelineColorBlendStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
+ vkPipelineColorBlendStateCreateInfo.pNext = nullptr;
+ vkPipelineColorBlendStateCreateInfo.flags = {};
+ vkPipelineColorBlendStateCreateInfo.logicOpEnable = VK_FALSE;
+ vkPipelineColorBlendStateCreateInfo.logicOp = VK_LOGIC_OP_COPY;
+ vkPipelineColorBlendStateCreateInfo.attachmentCount = 1;
+ vkPipelineColorBlendStateCreateInfo.pAttachments = vkPipelineColorBlendAttachmentState;
+ vkPipelineColorBlendStateCreateInfo.blendConstants[0] = 0.0f;
+ vkPipelineColorBlendStateCreateInfo.blendConstants[1] = 0.0f;
+ vkPipelineColorBlendStateCreateInfo.blendConstants[2] = 0.0f;
+ vkPipelineColorBlendStateCreateInfo.blendConstants[3] = 0.0f;
+
+ VkPipelineDynamicStateCreateInfo vkPipelineDynamicStateCreateInfo;
+ vkPipelineDynamicStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
+ vkPipelineDynamicStateCreateInfo.pNext = nullptr;
+ vkPipelineDynamicStateCreateInfo.flags = {};
+ vkPipelineDynamicStateCreateInfo.dynamicStateCount = 2;
+ vkPipelineDynamicStateCreateInfo.pDynamicStates = dynamicStates;
+
+ VkPipelineDepthStencilStateCreateInfo vkPipelineDepthStencilStateCreateInfo;
+ vkPipelineDepthStencilStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
+ vkPipelineDepthStencilStateCreateInfo.pNext = nullptr;
+ vkPipelineDepthStencilStateCreateInfo.flags = {};
+ vkPipelineDepthStencilStateCreateInfo.depthTestEnable = VK_TRUE;
+ vkPipelineDepthStencilStateCreateInfo.depthWriteEnable = VK_TRUE;
+ vkPipelineDepthStencilStateCreateInfo.depthCompareOp = VK_COMPARE_OP_LESS;
+ vkPipelineDepthStencilStateCreateInfo.depthBoundsTestEnable = VK_FALSE;
+ vkPipelineDepthStencilStateCreateInfo.stencilTestEnable = VK_FALSE;
+ vkPipelineDepthStencilStateCreateInfo.front = {};
+ vkPipelineDepthStencilStateCreateInfo.back = {};
+ vkPipelineDepthStencilStateCreateInfo.minDepthBounds = {};
+ vkPipelineDepthStencilStateCreateInfo.maxDepthBounds = {};
+
+ AssetHandle vertShaderAssetHandle = AM_Register("assets/shaders/vert.vert.spv");
+ AssetHandle textureFragShaderAssetHandle = AM_Register("assets/shaders/texture.frag.spv");
+ const Asset *textureVertShaderAsset = AM_Get(vertShaderAssetHandle);
+ const Asset *textureFragShaderAsset = AM_Get(textureFragShaderAssetHandle);
+ VkShaderModuleCreateInfo vkShaderModuleCreateInfo[2];
+ vkShaderModuleCreateInfo[0].codeSize = textureVertShaderAsset->size;
+ vkShaderModuleCreateInfo[0].pCode = reinterpret_cast<const uint32_t *>(textureVertShaderAsset->ptr);
+ vkShaderModuleCreateInfo[1].codeSize = textureFragShaderAsset->size;
+ vkShaderModuleCreateInfo[1].pCode = reinterpret_cast<const uint32_t *>(textureFragShaderAsset->ptr);
+ VkShaderModule shaderModules[2];
+
+ VkPipelineShaderStageCreateInfo vkPipelineShaderStageCreateInfo[2];
+ for (long i = 0; i < 2; ++i) {
+ vkShaderModuleCreateInfo[i].sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
+ vkShaderModuleCreateInfo[i].pNext = nullptr;
+ vkShaderModuleCreateInfo[i].flags = {};
+ vkPipelineShaderStageCreateInfo[i].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ vkPipelineShaderStageCreateInfo[i].pNext = nullptr;
+ vkPipelineShaderStageCreateInfo[i].flags = {};
+ vkPipelineShaderStageCreateInfo[i].pName = "main";
+ vkPipelineShaderStageCreateInfo[i].pSpecializationInfo = nullptr;
+
+ vkCreateShaderModule(vkDevice, &vkShaderModuleCreateInfo[i], vkAllocator, &shaderModules[i]);
+ }
+
+ vkPipelineShaderStageCreateInfo[0].module = shaderModules[0];
+ vkPipelineShaderStageCreateInfo[1].module = shaderModules[1];
+ vkPipelineShaderStageCreateInfo[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
+ vkPipelineShaderStageCreateInfo[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
+
+ VkGraphicsPipelineCreateInfo vkGraphicsPipelineCreateInfo[2];
+ for (long i = 0; i < 2; ++i) {
+ vkGraphicsPipelineCreateInfo[i].sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
+ vkGraphicsPipelineCreateInfo[i].pNext = nullptr;
+ vkGraphicsPipelineCreateInfo[i].flags = {};
+ vkGraphicsPipelineCreateInfo[i].stageCount = 2;
+ vkGraphicsPipelineCreateInfo[i].pStages = vkPipelineShaderStageCreateInfo;
+ vkGraphicsPipelineCreateInfo[i].pVertexInputState = &vkPipelineVertexInputStateCreateInfo;
+ vkGraphicsPipelineCreateInfo[i].pInputAssemblyState = &vkPipelineInputAssemblyStateCreateInfo;
+ vkGraphicsPipelineCreateInfo[i].pTessellationState = nullptr;
+ vkGraphicsPipelineCreateInfo[i].pViewportState = &vkPipelineViewportStateCreateInfo;
+ vkGraphicsPipelineCreateInfo[i].pMultisampleState = &vkPipelineMultisampleStateCreateInfo;
+ vkGraphicsPipelineCreateInfo[i].pDepthStencilState = &vkPipelineDepthStencilStateCreateInfo;
+ vkGraphicsPipelineCreateInfo[i].pColorBlendState = &vkPipelineColorBlendStateCreateInfo;
+ vkGraphicsPipelineCreateInfo[i].pDynamicState = &vkPipelineDynamicStateCreateInfo;
+ vkGraphicsPipelineCreateInfo[i].layout = pkePipelines.vkPipelineLayout_Texture;
+ vkGraphicsPipelineCreateInfo[i].renderPass = renderRenderPass;
+ vkGraphicsPipelineCreateInfo[i].subpass = 0;
+ vkGraphicsPipelineCreateInfo[i].basePipelineHandle = VK_NULL_HANDLE;
+ vkGraphicsPipelineCreateInfo[i].basePipelineIndex = {};
+ }
+
+ vkGraphicsPipelineCreateInfo[0].pRasterizationState = &vkPipelineRasterizationStateCreateInfoFill;
+ vkGraphicsPipelineCreateInfo[1].pRasterizationState = &vkPipelineRasterizationStateCreateInfoLine;
+
+ vkCreateGraphicsPipelines(vkDevice, VK_NULL_HANDLE, 2, vkGraphicsPipelineCreateInfo, vkAllocator, pkePipelines.pipelines.arr);
+
+ for (long i = 0; i < 2; ++i) {
+ vkDestroyShaderModule(vkDevice, shaderModules[i], vkAllocator);
+ }
+
+ AM_Destroy(textureFragShaderAssetHandle);
+ AM_Destroy(vertShaderAssetHandle);
+ }
}
void CreateFramebuffers() {
@@ -1530,7 +1831,7 @@ void CreateWindow(PKEWindowProperties *wp) {
glfwSetFramebufferSizeCallback(window, FramebufferResizeCallback);
CreateSwapchain();
CreateRenderPass();
- CreateGraphicsPipeline();
+ CreateGraphicsPipelines();
UpdatePresentDescriptorSets();
UpdateCameraProjection();
CreateFramebuffers();
@@ -1547,6 +1848,18 @@ void DestroyWindow() {
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
DestroySwapchain();
+
+ if (pkePipelines.vkSampler_Texture != VK_NULL_HANDLE)
+ vkDestroySampler(vkDevice, pkePipelines.vkSampler_Texture, vkAllocator);
+ for (long i = 0; i < 2; ++i) {
+ if (pkePipelines.pipelines.arr[i] != VK_NULL_HANDLE)
+ vkDestroyPipeline(vkDevice, pkePipelines.pipelines.arr[i], vkAllocator);
+ }
+ if (pkePipelines.vkPipelineLayout_Texture != VK_NULL_HANDLE)
+ vkDestroyPipelineLayout(vkDevice, pkePipelines.vkPipelineLayout_Texture, vkAllocator);
+ if (pkePipelines.vkDescriptorSetLayout_Texture != VK_NULL_HANDLE)
+ vkDestroyDescriptorSetLayout(vkDevice, pkePipelines.vkDescriptorSetLayout_Texture, vkAllocator);
+
for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
vkDestroyBuffer(vkDevice, UniformBuffers[i], vkAllocator);
vkDestroySemaphore(vkDevice, presentImageAvailableSemaphores[i], vkAllocator);
diff --git a/src/window.hpp b/src/window.hpp
index 91a3a30..0ab3910 100644
--- a/src/window.hpp
+++ b/src/window.hpp
@@ -54,6 +54,20 @@ struct UniformBufferObject {
extern UniformBufferObject UBO;
extern VkBuffer UniformBuffers[MAX_FRAMES_IN_FLIGHT];
+struct ImplementedPipelines {
+ VkDescriptorSetLayout vkDescriptorSetLayout_Texture = VK_NULL_HANDLE;
+ VkPipelineLayout vkPipelineLayout_Texture = VK_NULL_HANDLE;
+ VkSampler vkSampler_Texture = VK_NULL_HANDLE;
+ union {
+ VkPipeline arr[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
+ struct {
+ VkPipeline Texture;
+ VkPipeline TextureWireframe;
+ };
+ } pipelines;
+};
+extern ImplementedPipelines pkePipelines;
+
void CreateWindow(PKEWindowProperties *wp);
void DestroyWindow();
VkShaderModule UploadShader(AssetHandle handle);