Moved conservative raster initialization to where it's actually first used

Fixes #465
This commit is contained in:
saschawillems 2018-04-27 20:29:20 +02:00
parent 6b3dbb81a2
commit f29e024006

View file

@ -588,28 +588,12 @@ public:
*/
PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR = reinterpret_cast<PFN_vkGetPhysicalDeviceProperties2KHR>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2KHR"));
assert(vkGetPhysicalDeviceProperties2KHR);
const char* extName(VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME);
VkPhysicalDeviceProperties2KHR deviceProps2{};
conservativeRasterProps.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT;
deviceProps2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR;
deviceProps2.pNext = &conservativeRasterProps;
vkGetPhysicalDeviceProperties2KHR(physicalDevice, &deviceProps2);
/*
Conservative rasterization pipeline state
*/
VkPipelineRasterizationConservativeStateCreateInfoEXT conservativeRasterStateCI{};
conservativeRasterStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT;
conservativeRasterStateCI.conservativeRasterizationMode = VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT;
conservativeRasterStateCI.extraPrimitiveOverestimationSize = conservativeRasterProps.maxExtraPrimitiveOverestimationSize;
// Conservative rasterization state has to be chained into the pipeline rasterization state create info structure
rasterizationStateCI.pNext = &conservativeRasterStateCI;
/*
End of conservative rasterization setup
*/
// Vertex bindings and attributes
std::vector<VkVertexInputBindingDescription> vertexInputBindings = {
vks::initializers::vertexInputBindingDescription(0, sizeof(Vertex), VK_VERTEX_INPUT_RATE_VERTEX),
@ -635,7 +619,6 @@ public:
pipelineCreateInfo.pStages = shaderStages.data();
// Full screen pass
conservativeRasterStateCI.conservativeRasterizationMode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT;
shaderStages[0] = loadShader(getAssetPath() + "shaders/conservativeraster/fullscreen.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShader(getAssetPath() + "shaders/conservativeraster/fullscreen.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
// Empty vertex input state (full screen triangle generated in vertex shader)
@ -647,26 +630,39 @@ public:
pipelineCreateInfo.pVertexInputState = &vertexInputState;
pipelineCreateInfo.layout = pipelineLayouts.scene;
// Original triangle outline (no conservative rasterization)
// Original triangle outline
// TODO: Check support for lines
rasterizationStateCI.lineWidth = 2.0f;
rasterizationStateCI.polygonMode = VK_POLYGON_MODE_LINE;
conservativeRasterStateCI.conservativeRasterizationMode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT;
shaderStages[0] = loadShader(getAssetPath() + "shaders/conservativeraster/triangle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShader(getAssetPath() + "shaders/conservativeraster/triangleoverlay.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.triangleOverlay));
pipelineCreateInfo.renderPass = offscreenPass.renderPass;
// Triangle rendering
/*
Triangle rendering
*/
rasterizationStateCI.polygonMode = VK_POLYGON_MODE_FILL;
conservativeRasterStateCI.conservativeRasterizationMode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT;
shaderStages[0] = loadShader(getAssetPath() + "shaders/conservativeraster/triangle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShader(getAssetPath() + "shaders/conservativeraster/triangle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
// Default
/*
Basic pipeline
*/
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.triangle));
// Conservative rasterization enabled
/*
Pipeline with conservative rasterization enabled
*/
VkPipelineRasterizationConservativeStateCreateInfoEXT conservativeRasterStateCI{};
conservativeRasterStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT;
conservativeRasterStateCI.conservativeRasterizationMode = VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT;
conservativeRasterStateCI.extraPrimitiveOverestimationSize = conservativeRasterProps.maxExtraPrimitiveOverestimationSize;
// Conservative rasterization state has to be chained into the pipeline rasterization state create info structure
rasterizationStateCI.pNext = &conservativeRasterStateCI;
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.triangleConservativeRaster));
}