mirror of https://github.com/AxioDL/boo.git
Small hack to prevent AMD GCN hangs
This commit is contained in:
parent
fb91482282
commit
fdddeebf52
|
@ -11,6 +11,8 @@
|
||||||
#include "Common.hpp"
|
#include "Common.hpp"
|
||||||
#include "xxhash.h"
|
#include "xxhash.h"
|
||||||
|
|
||||||
|
#define AMD_PAL_HACK 1
|
||||||
|
|
||||||
#define VMA_IMPLEMENTATION
|
#define VMA_IMPLEMENTATION
|
||||||
#define VMA_STATIC_VULKAN_FUNCTIONS 0
|
#define VMA_STATIC_VULKAN_FUNCTIONS 0
|
||||||
#include "vk_mem_alloc.h"
|
#include "vk_mem_alloc.h"
|
||||||
|
@ -232,8 +234,8 @@ static void SetImageLayout(VkCommandBuffer cmd, VkImage image,
|
||||||
imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
|
||||||
VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
|
VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
|
||||||
VkPipelineStageFlags dest_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
|
VkPipelineStageFlags dest_stages = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
|
||||||
|
|
||||||
switch (old_image_layout)
|
switch (old_image_layout)
|
||||||
{
|
{
|
||||||
|
@ -421,6 +423,7 @@ bool VulkanContext::initVulkan(std::string_view appName, PFN_vkGetInstanceProcAd
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
m_layerNames.push_back("VK_LAYER_LUNARG_standard_validation");
|
m_layerNames.push_back("VK_LAYER_LUNARG_standard_validation");
|
||||||
|
//m_layerNames.push_back("VK_LAYER_LUNARG_api_dump");
|
||||||
//m_layerNames.push_back("VK_LAYER_LUNARG_core_validation");
|
//m_layerNames.push_back("VK_LAYER_LUNARG_core_validation");
|
||||||
//m_layerNames.push_back("VK_LAYER_LUNARG_object_tracker");
|
//m_layerNames.push_back("VK_LAYER_LUNARG_object_tracker");
|
||||||
//m_layerNames.push_back("VK_LAYER_LUNARG_parameter_validation");
|
//m_layerNames.push_back("VK_LAYER_LUNARG_parameter_validation");
|
||||||
|
@ -2269,6 +2272,9 @@ public:
|
||||||
viewportInfo.pScissors = nullptr;
|
viewportInfo.pScissors = nullptr;
|
||||||
dynamicStateEnables[dynamicState.dynamicStateCount++] = VK_DYNAMIC_STATE_VIEWPORT;
|
dynamicStateEnables[dynamicState.dynamicStateCount++] = VK_DYNAMIC_STATE_VIEWPORT;
|
||||||
dynamicStateEnables[dynamicState.dynamicStateCount++] = VK_DYNAMIC_STATE_SCISSOR;
|
dynamicStateEnables[dynamicState.dynamicStateCount++] = VK_DYNAMIC_STATE_SCISSOR;
|
||||||
|
#if AMD_PAL_HACK
|
||||||
|
dynamicStateEnables[dynamicState.dynamicStateCount++] = VK_DYNAMIC_STATE_BLEND_CONSTANTS;
|
||||||
|
#endif
|
||||||
|
|
||||||
VkPipelineRasterizationStateCreateInfo rasterizationInfo = {};
|
VkPipelineRasterizationStateCreateInfo rasterizationInfo = {};
|
||||||
rasterizationInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
rasterizationInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
||||||
|
@ -2679,6 +2685,14 @@ struct VulkanShaderDataBinding : GraphicsDataNode<IShaderDataBinding>
|
||||||
|
|
||||||
if (m_ibuf)
|
if (m_ibuf)
|
||||||
vk::CmdBindIndexBuffer(cmdBuf, m_iboBufs[b], m_iboOffs[b], VK_INDEX_TYPE_UINT32);
|
vk::CmdBindIndexBuffer(cmdBuf, m_iboBufs[b], m_iboOffs[b], VK_INDEX_TYPE_UINT32);
|
||||||
|
|
||||||
|
#if AMD_PAL_HACK
|
||||||
|
/* AMD GCN architecture is prone to hanging after binding a new pipeline without also refreshing the
|
||||||
|
* device context registers (i.e. viewport, scissor, line width, blend constants). Blend Constants
|
||||||
|
* are the simplest register to set within the PAL codebase. */
|
||||||
|
float dummy[4] = {};
|
||||||
|
vk::CmdSetBlendConstants(cmdBuf, dummy);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4008,7 +4022,7 @@ void VulkanCommandQueue::execute()
|
||||||
m_fillBuf ^= 1;
|
m_fillBuf ^= 1;
|
||||||
|
|
||||||
/* Queue the command buffer for execution */
|
/* Queue the command buffer for execution */
|
||||||
VkPipelineStageFlags pipeStageFlags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
VkPipelineStageFlags pipeStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
VkSubmitInfo submitInfo = {};
|
VkSubmitInfo submitInfo = {};
|
||||||
submitInfo.pNext = nullptr;
|
submitInfo.pNext = nullptr;
|
||||||
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||||
|
|
Loading…
Reference in New Issue