summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/ObjectCache.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@users.noreply.github.com>2017-02-18 21:58:30 +1000
committerGitHub <noreply@github.com>2017-02-18 21:58:30 +1000
commitb8eb1080cef4f067854ce5a0b1d250ce41107fe8 (patch)
tree38eb6d8cc1dc35a69234eb616378c8f740eaa81c /Source/Core/VideoBackends/Vulkan/ObjectCache.cpp
parent6acad279197d3b768737ca701e77439becc13681 (diff)
parente2ddb3853eb8b285ceb488543d68f8c48af2b64d (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.cpp21
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;