From 7eeba080c72ca14d92fff66c9d9196b55feaa50f Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sat, 9 Jan 2016 17:12:37 +0100 Subject: [PATCH] Fix primitive topology. Crashfix. --- GPU/Vulkan/DrawEngineVulkan.cpp | 10 ---------- GPU/Vulkan/StateMappingVulkan.cpp | 13 +++++++++++++ ext/native/thin3d/thin3d_vulkan.cpp | 6 ++++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index bc240fa2b3..90e1e2d580 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -52,16 +52,6 @@ enum { DRAW_BINDING_DYNUBO_BONE = 4, }; -const VkPrimitiveTopology prim[8] = { - VK_PRIMITIVE_TOPOLOGY_POINT_LIST, - VK_PRIMITIVE_TOPOLOGY_LINE_LIST, - VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // Vulkan doesn't do quads. We could do strips with restart-index though. We could also do RECT primitives in the geometry shader. -}; - enum { TRANSFORMED_VERTEX_BUFFER_SIZE = VERTEX_BUFFER_MAX * sizeof(TransformedVertex) }; diff --git a/GPU/Vulkan/StateMappingVulkan.cpp b/GPU/Vulkan/StateMappingVulkan.cpp index 6af78f6c6e..8c2a56c187 100644 --- a/GPU/Vulkan/StateMappingVulkan.cpp +++ b/GPU/Vulkan/StateMappingVulkan.cpp @@ -88,6 +88,17 @@ static const VkStencilOp stencilOps[] = { VK_STENCIL_OP_KEEP, // reserved }; +const VkPrimitiveTopology primToVulkan[8] = { + VK_PRIMITIVE_TOPOLOGY_POINT_LIST, + VK_PRIMITIVE_TOPOLOGY_LINE_LIST, + VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // Vulkan doesn't do quads. We could do strips with restart-index though. We could also do RECT primitives in the geometry shader. +}; + + bool ApplyShaderBlending() { return false; } @@ -249,6 +260,8 @@ void ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManager, int prim, Vulk } } + key.topology = primToVulkan[prim]; + VkViewport &vp = dynState.viewport; vp.x = vpAndScissor.viewportX; vp.y = vpAndScissor.viewportY; diff --git a/ext/native/thin3d/thin3d_vulkan.cpp b/ext/native/thin3d/thin3d_vulkan.cpp index fbdfc80e57..6a4fc56cad 100644 --- a/ext/native/thin3d/thin3d_vulkan.cpp +++ b/ext/native/thin3d/thin3d_vulkan.cpp @@ -563,8 +563,10 @@ public: private: void Destroy() { ILOG("texture destroyed: %p", this); - vkTex_->Destroy(vulkan_); - delete vkTex_; + if (vkTex_) { + vkTex_->Destroy(vulkan_); + delete vkTex_; + } } VulkanContext *vulkan_;