Command buffer fence ordering, vertex input refactored
This commit is contained in:
parent
b273739e66
commit
0da529d875
1 changed files with 37 additions and 77 deletions
|
|
@ -27,7 +27,6 @@
|
||||||
|
|
||||||
#include "VulkanModel.hpp"
|
#include "VulkanModel.hpp"
|
||||||
|
|
||||||
#define VERTEX_BUFFER_BIND_ID 0
|
|
||||||
#define ENABLE_VALIDATION false
|
#define ENABLE_VALIDATION false
|
||||||
|
|
||||||
class VulkanExample : public VulkanExampleBase
|
class VulkanExample : public VulkanExampleBase
|
||||||
|
|
@ -47,12 +46,6 @@ public:
|
||||||
vks::Model skysphere;
|
vks::Model skysphere;
|
||||||
} models;
|
} models;
|
||||||
|
|
||||||
struct {
|
|
||||||
VkPipelineVertexInputStateCreateInfo inputState;
|
|
||||||
std::vector<VkVertexInputBindingDescription> bindingDescriptions;
|
|
||||||
std::vector<VkVertexInputAttributeDescription> attributeDescriptions;
|
|
||||||
} vertices;
|
|
||||||
|
|
||||||
// Shared matrices used for thread push constant blocks
|
// Shared matrices used for thread push constant blocks
|
||||||
struct {
|
struct {
|
||||||
glm::mat4 projection;
|
glm::mat4 projection;
|
||||||
|
|
@ -450,55 +443,13 @@ public:
|
||||||
VK_CHECK_RESULT(vkEndCommandBuffer(primaryCommandBuffer));
|
VK_CHECK_RESULT(vkEndCommandBuffer(primaryCommandBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadMeshes()
|
void loadAssets()
|
||||||
{
|
{
|
||||||
models.ufo.loadFromFile(getAssetPath() + "models/retroufo_red_lowpoly.dae", vertexLayout, 0.12f, vulkanDevice, queue);
|
models.ufo.loadFromFile(getAssetPath() + "models/retroufo_red_lowpoly.dae", vertexLayout, 0.12f, vulkanDevice, queue);
|
||||||
models.skysphere.loadFromFile(getAssetPath() + "models/sphere.obj", vertexLayout, 1.0f, vulkanDevice, queue);
|
models.skysphere.loadFromFile(getAssetPath() + "models/sphere.obj", vertexLayout, 1.0f, vulkanDevice, queue);
|
||||||
objectSphereDim = std::max(std::max(models.ufo.dim.size.x, models.ufo.dim.size.y), models.ufo.dim.size.z);
|
objectSphereDim = std::max(std::max(models.ufo.dim.size.x, models.ufo.dim.size.y), models.ufo.dim.size.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupVertexDescriptions()
|
|
||||||
{
|
|
||||||
// Binding description
|
|
||||||
vertices.bindingDescriptions.resize(1);
|
|
||||||
vertices.bindingDescriptions[0] =
|
|
||||||
vks::initializers::vertexInputBindingDescription(
|
|
||||||
VERTEX_BUFFER_BIND_ID,
|
|
||||||
vertexLayout.stride(),
|
|
||||||
VK_VERTEX_INPUT_RATE_VERTEX);
|
|
||||||
|
|
||||||
// Attribute descriptions
|
|
||||||
// Describes memory layout and shader positions
|
|
||||||
vertices.attributeDescriptions.resize(3);
|
|
||||||
// Location 0 : Position
|
|
||||||
vertices.attributeDescriptions[0] =
|
|
||||||
vks::initializers::vertexInputAttributeDescription(
|
|
||||||
VERTEX_BUFFER_BIND_ID,
|
|
||||||
0,
|
|
||||||
VK_FORMAT_R32G32B32_SFLOAT,
|
|
||||||
0);
|
|
||||||
// Location 1 : Normal
|
|
||||||
vertices.attributeDescriptions[1] =
|
|
||||||
vks::initializers::vertexInputAttributeDescription(
|
|
||||||
VERTEX_BUFFER_BIND_ID,
|
|
||||||
1,
|
|
||||||
VK_FORMAT_R32G32B32_SFLOAT,
|
|
||||||
sizeof(float) * 3);
|
|
||||||
// Location 3 : Color
|
|
||||||
vertices.attributeDescriptions[2] =
|
|
||||||
vks::initializers::vertexInputAttributeDescription(
|
|
||||||
VERTEX_BUFFER_BIND_ID,
|
|
||||||
2,
|
|
||||||
VK_FORMAT_R32G32B32_SFLOAT,
|
|
||||||
sizeof(float) * 6);
|
|
||||||
|
|
||||||
vertices.inputState = vks::initializers::pipelineVertexInputStateCreateInfo();
|
|
||||||
vertices.inputState.vertexBindingDescriptionCount = vertices.bindingDescriptions.size();
|
|
||||||
vertices.inputState.pVertexBindingDescriptions = vertices.bindingDescriptions.data();
|
|
||||||
vertices.inputState.vertexAttributeDescriptionCount = vertices.attributeDescriptions.size();
|
|
||||||
vertices.inputState.pVertexAttributeDescriptions = vertices.attributeDescriptions.data();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupPipelineLayout()
|
void setupPipelineLayout()
|
||||||
{
|
{
|
||||||
VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo =
|
VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo =
|
||||||
|
|
@ -567,38 +518,48 @@ public:
|
||||||
dynamicStateEnables.size(),
|
dynamicStateEnables.size(),
|
||||||
0);
|
0);
|
||||||
|
|
||||||
// Solid rendering pipeline
|
|
||||||
// Load shaders
|
|
||||||
std::array<VkPipelineShaderStageCreateInfo, 2> shaderStages;
|
std::array<VkPipelineShaderStageCreateInfo, 2> shaderStages;
|
||||||
|
|
||||||
|
VkGraphicsPipelineCreateInfo pipelineCI = vks::initializers::pipelineCreateInfo(pipelineLayout, renderPass, 0);
|
||||||
|
pipelineCI.pInputAssemblyState = &inputAssemblyState;
|
||||||
|
pipelineCI.pRasterizationState = &rasterizationState;
|
||||||
|
pipelineCI.pColorBlendState = &colorBlendState;
|
||||||
|
pipelineCI.pMultisampleState = &multisampleState;
|
||||||
|
pipelineCI.pViewportState = &viewportState;
|
||||||
|
pipelineCI.pDepthStencilState = &depthStencilState;
|
||||||
|
pipelineCI.pDynamicState = &dynamicState;
|
||||||
|
pipelineCI.stageCount = shaderStages.size();
|
||||||
|
pipelineCI.pStages = shaderStages.data();
|
||||||
|
|
||||||
|
// Vertex bindings and attributes
|
||||||
|
const std::vector<VkVertexInputBindingDescription> vertexInputBindings = {
|
||||||
|
vks::initializers::vertexInputBindingDescription(0, vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX),
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::vector<VkVertexInputAttributeDescription> vertexInputAttributes = {
|
||||||
|
vks::initializers::vertexInputAttributeDescription(0, 0, VK_FORMAT_R32G32B32_SFLOAT, 0), // Location 0: Position
|
||||||
|
vks::initializers::vertexInputAttributeDescription(0, 1, VK_FORMAT_R32G32B32_SFLOAT, sizeof(float) * 3), // Location 1: Normal
|
||||||
|
vks::initializers::vertexInputAttributeDescription(0, 2, VK_FORMAT_R32G32B32_SFLOAT, sizeof(float) * 6), // Location 2: Color
|
||||||
|
};
|
||||||
|
VkPipelineVertexInputStateCreateInfo vertexInputStateCI = vks::initializers::pipelineVertexInputStateCreateInfo();
|
||||||
|
vertexInputStateCI.vertexBindingDescriptionCount = static_cast<uint32_t>(vertexInputBindings.size());
|
||||||
|
vertexInputStateCI.pVertexBindingDescriptions = vertexInputBindings.data();
|
||||||
|
vertexInputStateCI.vertexAttributeDescriptionCount = static_cast<uint32_t>(vertexInputAttributes.size());
|
||||||
|
vertexInputStateCI.pVertexAttributeDescriptions = vertexInputAttributes.data();
|
||||||
|
|
||||||
|
pipelineCI.pVertexInputState = &vertexInputStateCI;
|
||||||
|
|
||||||
|
// Object rendering pipeline
|
||||||
shaderStages[0] = loadShader(getAssetPath() + "shaders/multithreading/phong.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
shaderStages[0] = loadShader(getAssetPath() + "shaders/multithreading/phong.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
||||||
shaderStages[1] = loadShader(getAssetPath() + "shaders/multithreading/phong.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
shaderStages[1] = loadShader(getAssetPath() + "shaders/multithreading/phong.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.phong));
|
||||||
VkGraphicsPipelineCreateInfo pipelineCreateInfo =
|
|
||||||
vks::initializers::pipelineCreateInfo(
|
|
||||||
pipelineLayout,
|
|
||||||
renderPass,
|
|
||||||
0);
|
|
||||||
|
|
||||||
pipelineCreateInfo.pVertexInputState = &vertices.inputState;
|
|
||||||
pipelineCreateInfo.pInputAssemblyState = &inputAssemblyState;
|
|
||||||
pipelineCreateInfo.pRasterizationState = &rasterizationState;
|
|
||||||
pipelineCreateInfo.pColorBlendState = &colorBlendState;
|
|
||||||
pipelineCreateInfo.pMultisampleState = &multisampleState;
|
|
||||||
pipelineCreateInfo.pViewportState = &viewportState;
|
|
||||||
pipelineCreateInfo.pDepthStencilState = &depthStencilState;
|
|
||||||
pipelineCreateInfo.pDynamicState = &dynamicState;
|
|
||||||
pipelineCreateInfo.stageCount = shaderStages.size();
|
|
||||||
pipelineCreateInfo.pStages = shaderStages.data();
|
|
||||||
|
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.phong));
|
|
||||||
|
|
||||||
// Star sphere rendering pipeline
|
// Star sphere rendering pipeline
|
||||||
rasterizationState.cullMode = VK_CULL_MODE_FRONT_BIT;
|
rasterizationState.cullMode = VK_CULL_MODE_FRONT_BIT;
|
||||||
depthStencilState.depthWriteEnable = VK_FALSE;
|
depthStencilState.depthWriteEnable = VK_FALSE;
|
||||||
shaderStages[0] = loadShader(getAssetPath() + "shaders/multithreading/starsphere.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
shaderStages[0] = loadShader(getAssetPath() + "shaders/multithreading/starsphere.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
||||||
shaderStages[1] = loadShader(getAssetPath() + "shaders/multithreading/starsphere.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
shaderStages[1] = loadShader(getAssetPath() + "shaders/multithreading/starsphere.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.starsphere));
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.starsphere));
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateMatrices()
|
void updateMatrices()
|
||||||
|
|
@ -622,10 +583,10 @@ public:
|
||||||
VK_CHECK_RESULT(fenceRes);
|
VK_CHECK_RESULT(fenceRes);
|
||||||
vkResetFences(device, 1, &renderFence);
|
vkResetFences(device, 1, &renderFence);
|
||||||
|
|
||||||
updateCommandBuffers(frameBuffers[currentBuffer]);
|
|
||||||
|
|
||||||
VulkanExampleBase::prepareFrame();
|
VulkanExampleBase::prepareFrame();
|
||||||
|
|
||||||
|
updateCommandBuffers(frameBuffers[currentBuffer]);
|
||||||
|
|
||||||
submitInfo.commandBufferCount = 1;
|
submitInfo.commandBufferCount = 1;
|
||||||
submitInfo.pCommandBuffers = &primaryCommandBuffer;
|
submitInfo.pCommandBuffers = &primaryCommandBuffer;
|
||||||
|
|
||||||
|
|
@ -639,9 +600,8 @@ public:
|
||||||
VulkanExampleBase::prepare();
|
VulkanExampleBase::prepare();
|
||||||
// Create a fence for synchronization
|
// Create a fence for synchronization
|
||||||
VkFenceCreateInfo fenceCreateInfo = vks::initializers::fenceCreateInfo(VK_FENCE_CREATE_SIGNALED_BIT);
|
VkFenceCreateInfo fenceCreateInfo = vks::initializers::fenceCreateInfo(VK_FENCE_CREATE_SIGNALED_BIT);
|
||||||
vkCreateFence(device, &fenceCreateInfo, NULL, &renderFence);
|
vkCreateFence(device, &fenceCreateInfo, nullptr, &renderFence);
|
||||||
loadMeshes();
|
loadAssets();
|
||||||
setupVertexDescriptions();
|
|
||||||
setupPipelineLayout();
|
setupPipelineLayout();
|
||||||
preparePipelines();
|
preparePipelines();
|
||||||
prepareMultiThreadedRenderer();
|
prepareMultiThreadedRenderer();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue