Survive pipeline creation failure on Vulkan. Makes Burnout playable on Pocophone... Sigh.

Minor cleanups.
This commit is contained in:
Henrik Rydgård 2019-03-11 16:29:08 +01:00
parent 186584e087
commit 3445f39f3f
3 changed files with 12 additions and 9 deletions

View file

@ -828,7 +828,7 @@ std::string ShaderManagerGLES::DebugGetShaderString(std::string id, DebugShaderT
// as sometimes these features might have an effect on the ID bits. // as sometimes these features might have an effect on the ID bits.
#define CACHE_HEADER_MAGIC 0x83277592 #define CACHE_HEADER_MAGIC 0x83277592
#define CACHE_VERSION 13 #define CACHE_VERSION 14
struct CacheHeader { struct CacheHeader {
uint32_t magic; uint32_t magic;
uint32_t version; uint32_t version;

View file

@ -135,7 +135,7 @@ static VulkanPipeline *CreateVulkanPipeline(VkDevice device, VkPipelineCache pip
PROFILE_THIS_SCOPE("pipelinebuild"); PROFILE_THIS_SCOPE("pipelinebuild");
bool useBlendConstant = false; bool useBlendConstant = false;
VkPipelineColorBlendAttachmentState blend0 = {}; VkPipelineColorBlendAttachmentState blend0{};
blend0.blendEnable = key.blendEnable; blend0.blendEnable = key.blendEnable;
if (key.blendEnable) { if (key.blendEnable) {
blend0.colorBlendOp = (VkBlendOp)key.blendOpColor; blend0.colorBlendOp = (VkBlendOp)key.blendOpColor;
@ -174,7 +174,7 @@ static VulkanPipeline *CreateVulkanPipeline(VkDevice device, VkPipelineCache pip
dss.depthWriteEnable = key.depthWriteEnable; dss.depthWriteEnable = key.depthWriteEnable;
} }
VkDynamicState dynamicStates[8]; VkDynamicState dynamicStates[8]{};
int numDyn = 0; int numDyn = 0;
if (key.blendEnable && if (key.blendEnable &&
(UsesBlendConstant(key.srcAlpha) || UsesBlendConstant(key.srcColor) || UsesBlendConstant(key.destAlpha) || UsesBlendConstant(key.destColor))) { (UsesBlendConstant(key.srcAlpha) || UsesBlendConstant(key.srcColor) || UsesBlendConstant(key.destAlpha) || UsesBlendConstant(key.destColor))) {
@ -208,16 +208,14 @@ static VulkanPipeline *CreateVulkanPipeline(VkDevice device, VkPipelineCache pip
ms.pSampleMask = nullptr; ms.pSampleMask = nullptr;
ms.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; ms.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
VkPipelineShaderStageCreateInfo ss[2]; VkPipelineShaderStageCreateInfo ss[2]{};
ss[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; ss[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
ss[0].pNext = nullptr;
ss[0].stage = VK_SHADER_STAGE_VERTEX_BIT; ss[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
ss[0].pSpecializationInfo = nullptr; ss[0].pSpecializationInfo = nullptr;
ss[0].module = vs->GetModule(); ss[0].module = vs->GetModule();
ss[0].pName = "main"; ss[0].pName = "main";
ss[0].flags = 0; ss[0].flags = 0;
ss[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; ss[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
ss[1].pNext = nullptr;
ss[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT; ss[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
ss[1].pSpecializationInfo = nullptr; ss[1].pSpecializationInfo = nullptr;
ss[1].module = fs->GetModule(); ss[1].module = fs->GetModule();
@ -252,7 +250,7 @@ static VulkanPipeline *CreateVulkanPipeline(VkDevice device, VkPipelineCache pip
vertexStride = 36; vertexStride = 36;
} }
VkVertexInputBindingDescription ibd; VkVertexInputBindingDescription ibd{};
ibd.binding = 0; ibd.binding = 0;
ibd.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; ibd.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
ibd.stride = vertexStride; ibd.stride = vertexStride;
@ -297,7 +295,12 @@ static VulkanPipeline *CreateVulkanPipeline(VkDevice device, VkPipelineCache pip
VkPipeline pipeline; VkPipeline pipeline;
VkResult result = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipe, nullptr, &pipeline); VkResult result = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipe, nullptr, &pipeline);
if (result != VK_SUCCESS) { if (result != VK_SUCCESS) {
_assert_msg_(G3D, false, "Failed creating graphics pipeline! result='%s'", VulkanResultToString(result)); if (result == VK_INCOMPLETE) {
// Bad return value seen on Adreno in Burnout :( Try to ignore?
// TODO: Log all the information we can here!
} else {
_dbg_assert_msg_(G3D, false, "Failed creating graphics pipeline! result='%s'", VulkanResultToString(result));
}
ERROR_LOG(G3D, "Failed creating graphics pipeline! result='%s'", VulkanResultToString(result)); ERROR_LOG(G3D, "Failed creating graphics pipeline! result='%s'", VulkanResultToString(result));
// Create a placeholder to avoid creating over and over if something is broken. // Create a placeholder to avoid creating over and over if something is broken.
VulkanPipeline *nullPipeline = new VulkanPipeline(); VulkanPipeline *nullPipeline = new VulkanPipeline();

View file

@ -361,7 +361,7 @@ VulkanFragmentShader *ShaderManagerVulkan::GetFragmentShaderFromModule(VkShaderM
// instantaneous. // instantaneous.
#define CACHE_HEADER_MAGIC 0xff51f420 #define CACHE_HEADER_MAGIC 0xff51f420
#define CACHE_VERSION 16 #define CACHE_VERSION 17
struct VulkanCacheHeader { struct VulkanCacheHeader {
uint32_t magic; uint32_t magic;
uint32_t version; uint32_t version;