AnsweredAssumed Answered

vkCreateGraphicsPipelines returns VK_ERROR_INITIALIZATION_FAILED

Question asked by Andrey2007AMD on Sep 20, 2018
Latest reply on Sep 20, 2018 by xhuang

Hi All !

I use glslang tool for compilation GLSL/HLSL to SPIR-V.

 

We have two identical HLSL and GLSL vertex shaders. vkCreateGraphicsPipelines returns VK_ERROR_INITIALIZATION_FAILED, if I use SPIR-V code from HLSL, but if I use SPIR-V code from GLSL it works correctly.

 

Note: bug happens only AMD GPU! (AMD R7 240, AMD R7 350X) I use the last drivers 09.2018. On nVidia/Intel it works correctly.

 

HLSL Vertex Shader:

 

#ifndef NUM_BONES
#define NUM_BONES 47
#endif

#ifndef NUM_WEIGHT 
#define NUM_WEIGHT 4
#endif

typedef int4 BlendIndicesType;

cbuffer : register(b0) {
     uniform row_major float4x4 ModelViewProjection;
     uniform row_major float4x4 MatTexture;
     uniform float4 LightDir;        //Light position in world space
     uniform row_major float3x4 bones[NUM_BONES];
};

struct VS { 
     layout(location = 0) float4  Pos             : POSITION;
     layout(location = 1) float4  BlendWeights    : BLENDWEIGHT;
     layout(location = 7) BlendIndicesType  BlendIndices    : BLENDINDICES;
     layout(location = 2) float3  Normal          : NORMAL;
     layout(location = 8) float2  Tex0            : TEXCOORD0;
};

struct PS { 
     float4  Pos             : POSITION;
     layout(location = 0) float2 Tex0 : TEXCOORD0;
     layout(location = 1) float3 Normal : TEXCOORD1;
     layout(location = 2) float3 LightDir : TEXCOORD2;
     layout(location = 3) float4 shadowCrd: TEXCOORD3;
};

PS vsMain(in VS In)
{
     PS Out;
     float4 Pos = float4(0.0f, 0.0f, 0.0f, 1.0f);
     float3 Normal = float3(0.0f, 0.0f, 0.0f);
     for(int i = 0; i < NUM_WEIGHT; ++i) {
          const int boneIndex = In.BlendIndices[i];
          Pos.xyz += (mul(bones[boneIndex], In.Pos).xyz * In.BlendWeights[i]);
          Normal.xyz += (mul((float3x3)bones[boneIndex], In.Normal) * In.BlendWeights[i]);
     }
     Out.Pos = mul(In.Pos, ModelViewProjection);
     Out.Tex0 = In.Tex0;
     Out.shadowCrd = mul(Pos, MatTexture);
     Out.LightDir.xyz = -LightDir.xyz;
     return Out;
}

 

 

glsl Vertex Shader:

//
#version 450 core
#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enable

#ifndef NUM_BONES
#define NUM_BONES 47
#endif
#ifndef NUM_WEIGHT
#define NUM_WEIGHT 4
#endif

layout (std140, binding = 0) uniform UBODecl {
     mat4 ModelViewProjection;
     vec4 LightDir;
     mat4 MatTexture;
     vec4 bones[3 * NUM_BONES];
} UBO;

layout(location = 0) in vec4 POSITION;         // position in projection space
layout(location = 2) in vec3 NORMAL;
layout(location = 8) in vec2 TEXCOORD0;        // texture coordinate
layout(location = 1) in vec4 BLENDWEIGHT;
layout(location = 7) in ivec4  BLENDINDICES;

layout(location = 0) out vec2 Tex0;
layout(location = 1) out vec3 Normal;
layout(location = 2) out vec3 LightDir;
layout(location = 3) out vec4 shadowCrd;

void main()
{
     vec4 Pos = vec4(0.0, 0.0, 0.0, 1.0);
     vec4 position = vec4(POSITION.xyz, 1.0);
     Normal = vec3(0.0, 0.0, 0.0);
     ivec4 BoneIndices = ivec4(BLENDINDICES);
     vec4 BlendWeight = BLENDWEIGHT;
     for(int i = 0; i < NUM_WEIGHT; ++i) {
          int index = 3 * BoneIndices[i];
          float weight = BlendWeight[i];
          vec3 v;
          v.x = dot(UBO.bones[index + 0], position);
          v.y = dot(UBO.bones[index + 1], position);
          v.z = dot(UBO.bones[index + 2], position); 
          Pos.xyz += (v.xyz * weight);
          v.x = dot(UBO.bones[index + 0].xyz, NORMAL);
          v.y = dot(UBO.bones[index + 1].xyz, NORMAL);
          v.z = dot(UBO.bones[index + 2].xyz, NORMAL); 
          Normal.xyz += (v.xyz * weight);
     }
     gl_Position = UBO.ModelViewProjection * Pos;
     Tex0 = TEXCOORD0;
     shadowCrd = UBO.MatTexture * Pos;
     LightDir = -UBO.LightDir.xyz;
}

 

What do I do wrong ?

I can provide additional information.

 

I attached The simple project.

Attachments

Outcomes