diff options
| author | Stenzek <stenzek@users.noreply.github.com> | 2017-02-18 21:58:30 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-02-18 21:58:30 +1000 |
| commit | b8eb1080cef4f067854ce5a0b1d250ce41107fe8 (patch) | |
| tree | 38eb6d8cc1dc35a69234eb616378c8f740eaa81c /Source/Core/VideoBackends/Vulkan/ObjectCache.cpp | |
| parent | 6acad279197d3b768737ca701e77439becc13681 (diff) | |
| parent | e2ddb3853eb8b285ceb488543d68f8c48af2b64d (diff) | |
Merge pull request #4924 from stenzek/vulkan-list-restart
Vulkan: Fix GPU hangs on AMD Polaris
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/ObjectCache.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/ObjectCache.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/ObjectCache.cpp b/Source/Core/VideoBackends/Vulkan/ObjectCache.cpp index 21459e8a8a..e484c27dac 100644 --- a/Source/Core/VideoBackends/Vulkan/ObjectCache.cpp +++ b/Source/Core/VideoBackends/Vulkan/ObjectCache.cpp @@ -72,6 +72,14 @@ bool ObjectCache::Initialize() return true; } +static bool IsStripPrimitiveTopology(VkPrimitiveTopology topology) +{ + return topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP || + topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP || + topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY || + topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY; +} + static VkPipelineRasterizationStateCreateInfo GetVulkanRasterizationState(const RasterizationState& state) { @@ -185,9 +193,20 @@ VkPipeline ObjectCache::CreatePipeline(const PipelineInfo& info) nullptr, // const void* pNext 0, // VkPipelineInputAssemblyStateCreateFlags flags info.primitive_topology, // VkPrimitiveTopology topology - VK_TRUE // VkBool32 primitiveRestartEnable + VK_FALSE // VkBool32 primitiveRestartEnable }; + // See Vulkan spec, section 19: + // If topology is VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST, + // VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY, + // VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, + // primitiveRestartEnable must be VK_FALSE + if (g_ActiveConfig.backend_info.bSupportsPrimitiveRestart && + IsStripPrimitiveTopology(info.primitive_topology)) + { + input_assembly_state.primitiveRestartEnable = VK_TRUE; + } + // Shaders to stages VkPipelineShaderStageCreateInfo shader_stages[3]; uint32_t num_shader_stages = 0; |
