Invalid vertex program header

I’m not sure if cross site posting is allowed, since I also posted my issue in NVIDIAs Vulkan forum, however, this is my issue:

Each of my shaders are passed through a custom compiler, then through LunarGLASS, then finally through glslang, this being the complete output:

#version 450
// LunarGOO output
struct BrushData {
	int member0;
	vec3 member1;
	vec4 member2;
	vec4 member3;
	vec4 member4;
	vec2 member5;
	vec2 member6;
};
struct PacketData {
	mat4 member0;
	BrushData member1;
};
layout(std140, set=0, binding=0) uniform SharedData {
	mat4 member0;
} _uniformSharedData;
layout(std140, set=1, binding=0) uniform PacketBatch {
	PacketData member0[455];
} _uniformPacketBatch;
layout(push_constant) uniform PushConstant {
	int member0;
	int member1;
	int member2;
	int member3;
} _uniformPushConstant;
layout(set=2, binding=0) uniform sampler2D BrushImage[56];
layout(location=0) in vec2 gIn_VSIn_In_Position_0;
layout(location=1) in vec2 gIn_VSIn_In_UV_1;
layout(location=1) out vec2 gOut_VSOut_R_UV_1;
const float C_10000d0 = 10000.0;
const float C_1d0 = 1.0;

void main()
{
	float sitofp = float(_uniformPushConstant.member3);
	float fdivtmp = sitofp / C_10000d0;
	float fsubtmp = C_1d0 - fdivtmp;
	vec4 H_z8w9nb = vec4(gIn_VSIn_In_Position_0.x, gIn_VSIn_In_Position_0.y, fsubtmp, C_1d0);
	highp float dotres = dot(H_z8w9nb, _uniformPacketBatch.member0[_uniformPushConstant.member0].member0[0]);
	highp float dotres1 = dot(H_z8w9nb, _uniformPacketBatch.member0[_uniformPushConstant.member0].member0[1]);
	highp float dotres2 = dot(H_z8w9nb, _uniformPacketBatch.member0[_uniformPushConstant.member0].member0[2]);
	highp float dotres3 = dot(H_z8w9nb, _uniformPacketBatch.member0[_uniformPushConstant.member0].member0[3]);
	vec4 H_siz04c = vec4(dotres, dotres1, dotres2, dotres3);
	highp float dotres4 = dot(H_siz04c, _uniformSharedData.member0[0]);
	highp float dotres5 = dot(H_siz04c, _uniformSharedData.member0[1]);
	highp float dotres6 = dot(H_siz04c, _uniformSharedData.member0[2]);
	highp float dotres7 = dot(H_siz04c, _uniformSharedData.member0[3]);
	vec4 H_gg6lc3 = vec4(dotres4, dotres5, dotres6, dotres7);
	gl_Position = H_gg6lc3;
	gOut_VSOut_R_UV_1 = gIn_VSIn_In_UV_1;
	
}

However (With validation) when attempting to create the pipeline, the following is spit out (A bit of custom logging, but the main message is still there):

ERROR: [Driver] Code 2 : Vertex info
-----------
Internal error: assembly compile error for vertex shader at offset 0:
-- error message --
line 1, column 1:  error: invalid vertex program header
-- internal assembly text --

WARNING: [ParameterValidation] Code 9 : vkCreateGraphicsPipelines: returned VK_ERROR_INVALID_SHADER_NV, indicating that one or more shaders failed to compile or link
[-1000012000, ErrorInvalidShaderNV] - Failed to create graphics pipeline!

So for some reason the program header is invalid, looking at a past post his issue was that he was exceeding the common 64k buffer limit, however I do not find that to be the case here, since: (My array sizes are passed as preprocessors before shader compilation)

sizeof BrushData = 4 + 12 + 16 * 3 + 8 * 2 = 80
sizeof PacketData = 64 + sizeof BrushData = 144
sizeof PacketBatch = sizeof BrushData * 455 = 65520

And assuming the max limit is 65536, this should fit well within the limits, right? Unless the compiler is changing the memory layout I can’t think of what’s wrong…

      • Updated - - -

And if it helps, this is the compiled (Pre-Driver) spirv:

1:             ExtInstImport  "GLSL.std.450"
                              MemoryModel Logical GLSL450
                              EntryPoint Vertex 4  "main" 31 120 125 126
                              Source GLSL 450
                              Name 4  "main"
                              Name 8  "sitofp"
                              Name 10  "PushConstant"
                              MemberName 10(PushConstant) 0  "member0"
                              MemberName 10(PushConstant) 1  "member1"
                              MemberName 10(PushConstant) 2  "member2"
                              MemberName 10(PushConstant) 3  "member3"
                              Name 12  "_uniformPushConstant"
                              Name 18  "fdivtmp"
                              Name 22  "fsubtmp"
                              Name 28  "H_z8w9nb"
                              Name 31  "gIn_VSIn_In_Position_0"
                              Name 42  "dotres"
                              Name 45  "BrushData"
                              MemberName 45(BrushData) 0  "member0"
                              MemberName 45(BrushData) 1  "member1"
                              MemberName 45(BrushData) 2  "member2"
                              MemberName 45(BrushData) 3  "member3"
                              MemberName 45(BrushData) 4  "member4"
                              MemberName 45(BrushData) 5  "member5"
                              Name 46  "PacketData"
                              MemberName 46(PacketData) 0  "member0"
                              MemberName 46(PacketData) 1  "member1"
                              Name 49  "PacketBatch"
                              MemberName 49(PacketBatch) 0  "member0"
                              Name 51  "_uniformPacketBatch"
                              Name 59  "dotres1"
                              Name 67  "dotres2"
                              Name 75  "dotres3"
                              Name 82  "H_siz04c"
                              Name 88  "dotres4"
                              Name 90  "SharedData"
                              MemberName 90(SharedData) 0  "member0"
                              Name 92  "_uniformSharedData"
                              Name 96  "dotres5"
                              Name 101  "dotres6"
                              Name 106  "dotres7"
                              Name 111  "H_gg6lc3"
                              Name 118  "gl_PerVertex"
                              MemberName 118(gl_PerVertex) 0  "gl_Position"
                              MemberName 118(gl_PerVertex) 1  "gl_PointSize"
                              MemberName 118(gl_PerVertex) 2  "gl_ClipDistance"
                              MemberName 118(gl_PerVertex) 3  "gl_CullDistance"
                              Name 120  ""
                              Name 125  "gOut_VSOut_R_UV_1"
                              Name 126  "gIn_VSIn_In_UV_1"
                              Name 133  "BrushImage"
                              MemberDecorate 10(PushConstant) 0 Offset 0
                              MemberDecorate 10(PushConstant) 1 Offset 4
                              MemberDecorate 10(PushConstant) 2 Offset 8
                              MemberDecorate 10(PushConstant) 3 Offset 12
                              Decorate 10(PushConstant) Block
                              Decorate 31(gIn_VSIn_In_Position_0) Location 0
                              MemberDecorate 45(BrushData) 0 Offset 0
                              MemberDecorate 45(BrushData) 1 Offset 16
                              MemberDecorate 45(BrushData) 2 Offset 32
                              MemberDecorate 45(BrushData) 3 Offset 48
                              MemberDecorate 45(BrushData) 4 Offset 64
                              MemberDecorate 45(BrushData) 5 Offset 72
                              MemberDecorate 46(PacketData) 0 ColMajor
                              MemberDecorate 46(PacketData) 0 Offset 0
                              MemberDecorate 46(PacketData) 0 MatrixStride 16
                              MemberDecorate 46(PacketData) 1 Offset 64
                              Decorate 48 ArrayStride 144
                              MemberDecorate 49(PacketBatch) 0 Offset 0
                              Decorate 49(PacketBatch) Block
                              Decorate 51(_uniformPacketBatch) DescriptorSet 1
                              Decorate 51(_uniformPacketBatch) Binding 0
                              MemberDecorate 90(SharedData) 0 ColMajor
                              MemberDecorate 90(SharedData) 0 Offset 0
                              MemberDecorate 90(SharedData) 0 MatrixStride 16
                              Decorate 90(SharedData) Block
                              Decorate 92(_uniformSharedData) DescriptorSet 0
                              Decorate 92(_uniformSharedData) Binding 0
                              MemberDecorate 118(gl_PerVertex) 0 BuiltIn Position
                              MemberDecorate 118(gl_PerVertex) 1 BuiltIn PointSize
                              MemberDecorate 118(gl_PerVertex) 2 BuiltIn ClipDistance
                              MemberDecorate 118(gl_PerVertex) 3 BuiltIn CullDistance
                              Decorate 118(gl_PerVertex) Block
                              Decorate 125(gOut_VSOut_R_UV_1) Location 1
                              Decorate 126(gIn_VSIn_In_UV_1) Location 1
                              Decorate 133(BrushImage) DescriptorSet 2
                              Decorate 133(BrushImage) Binding 0
               2:             TypeVoid
               3:             TypeFunction 2
               6:             TypeFloat 32
               7:             TypePointer Function 6(float)
               9:             TypeInt 32 1
10(PushConstant):             TypeStruct 9(int) 9(int) 9(int) 9(int)
              11:             TypePointer PushConstant 10(PushConstant)
12(_uniformPushConstant):     11(ptr) Variable PushConstant
              13:      9(int) Constant 3
              14:             TypePointer PushConstant 9(int)
              20:    6(float) Constant 1176256512
              23:    6(float) Constant 1065353216
              26:             TypeVector 6(float) 4
              27:             TypePointer Function 26(fvec4)
              29:             TypeVector 6(float) 2
              30:             TypePointer Input 29(fvec2)
31(gIn_VSIn_In_Position_0):     30(ptr) Variable Input
              32:             TypeInt 32 0
              33:     32(int) Constant 0
              34:             TypePointer Input 6(float)
              37:     32(int) Constant 1
              44:             TypeMatrix 26(fvec4) 4
   45(BrushData):             TypeStruct 9(int) 26(fvec4) 26(fvec4) 26(fvec4) 29(fvec2) 29(fvec2)
  46(PacketData):             TypeStruct 44 45(BrushData)
              47:     32(int) Constant 496
              48:             TypeArray 46(PacketData) 47
 49(PacketBatch):             TypeStruct 48
              50:             TypePointer Uniform 49(PacketBatch)
51(_uniformPacketBatch):     50(ptr) Variable Uniform
              52:      9(int) Constant 0
              55:             TypePointer Uniform 26(fvec4)
              63:      9(int) Constant 1
              71:      9(int) Constant 2
  90(SharedData):             TypeStruct 44
              91:             TypePointer Uniform 90(SharedData)
92(_uniformSharedData):     91(ptr) Variable Uniform
             117:             TypeArray 6(float) 37
118(gl_PerVertex):             TypeStruct 26(fvec4) 6(float) 117 117
             119:             TypePointer Output 118(gl_PerVertex)
             120:    119(ptr) Variable Output
             122:             TypePointer Output 26(fvec4)
             124:             TypePointer Output 29(fvec2)
125(gOut_VSOut_R_UV_1):    124(ptr) Variable Output
126(gIn_VSIn_In_UV_1):     30(ptr) Variable Input
             128:             TypeImage 6(float) 2D sampled format:Unknown
             129:             TypeSampledImage 128
             130:     32(int) Constant 56
             131:             TypeArray 129 130
             132:             TypePointer UniformConstant 131
 133(BrushImage):    132(ptr) Variable UniformConstant
         4(main):           2 Function None 3
               5:             Label
       8(sitofp):      7(ptr) Variable Function
     18(fdivtmp):      7(ptr) Variable Function
     22(fsubtmp):      7(ptr) Variable Function
    28(H_z8w9nb):     27(ptr) Variable Function
      42(dotres):      7(ptr) Variable Function
     59(dotres1):      7(ptr) Variable Function
     67(dotres2):      7(ptr) Variable Function
     75(dotres3):      7(ptr) Variable Function
    82(H_siz04c):     27(ptr) Variable Function
     88(dotres4):      7(ptr) Variable Function
     96(dotres5):      7(ptr) Variable Function
    101(dotres6):      7(ptr) Variable Function
    106(dotres7):      7(ptr) Variable Function
   111(H_gg6lc3):     27(ptr) Variable Function
              15:     14(ptr) AccessChain 12(_uniformPushConstant) 13
              16:      9(int) Load 15
              17:    6(float) ConvertSToF 16
                              Store 8(sitofp) 17
              19:    6(float) Load 8(sitofp)
              21:    6(float) FDiv 19 20
                              Store 18(fdivtmp) 21
              24:    6(float) Load 18(fdivtmp)
              25:    6(float) FSub 23 24
                              Store 22(fsubtmp) 25
              35:     34(ptr) AccessChain 31(gIn_VSIn_In_Position_0) 33
              36:    6(float) Load 35
              38:     34(ptr) AccessChain 31(gIn_VSIn_In_Position_0) 37
              39:    6(float) Load 38
              40:    6(float) Load 22(fsubtmp)
              41:   26(fvec4) CompositeConstruct 36 39 40 23
                              Store 28(H_z8w9nb) 41
              43:   26(fvec4) Load 28(H_z8w9nb)
              53:     14(ptr) AccessChain 12(_uniformPushConstant) 52
              54:      9(int) Load 53
              56:     55(ptr) AccessChain 51(_uniformPacketBatch) 52 54 52 52
              57:   26(fvec4) Load 56
              58:    6(float) Dot 43 57
                              Store 42(dotres) 58
              60:   26(fvec4) Load 28(H_z8w9nb)
              61:     14(ptr) AccessChain 12(_uniformPushConstant) 52
              62:      9(int) Load 61
              64:     55(ptr) AccessChain 51(_uniformPacketBatch) 52 62 52 63
              65:   26(fvec4) Load 64
              66:    6(float) Dot 60 65
                              Store 59(dotres1) 66
              68:   26(fvec4) Load 28(H_z8w9nb)
              69:     14(ptr) AccessChain 12(_uniformPushConstant) 52
              70:      9(int) Load 69
              72:     55(ptr) AccessChain 51(_uniformPacketBatch) 52 70 52 71
              73:   26(fvec4) Load 72
              74:    6(float) Dot 68 73
                              Store 67(dotres2) 74
              76:   26(fvec4) Load 28(H_z8w9nb)
              77:     14(ptr) AccessChain 12(_uniformPushConstant) 52
              78:      9(int) Load 77
              79:     55(ptr) AccessChain 51(_uniformPacketBatch) 52 78 52 13
              80:   26(fvec4) Load 79
              81:    6(float) Dot 76 80
                              Store 75(dotres3) 81
              83:    6(float) Load 42(dotres)
              84:    6(float) Load 59(dotres1)
              85:    6(float) Load 67(dotres2)
              86:    6(float) Load 75(dotres3)
              87:   26(fvec4) CompositeConstruct 83 84 85 86
                              Store 82(H_siz04c) 87
              89:   26(fvec4) Load 82(H_siz04c)
              93:     55(ptr) AccessChain 92(_uniformSharedData) 52 52
              94:   26(fvec4) Load 93
              95:    6(float) Dot 89 94
                              Store 88(dotres4) 95
              97:   26(fvec4) Load 82(H_siz04c)
              98:     55(ptr) AccessChain 92(_uniformSharedData) 52 63
              99:   26(fvec4) Load 98
             100:    6(float) Dot 97 99
                              Store 96(dotres5) 100
             102:   26(fvec4) Load 82(H_siz04c)
             103:     55(ptr) AccessChain 92(_uniformSharedData) 52 71
             104:   26(fvec4) Load 103
             105:    6(float) Dot 102 104
                              Store 101(dotres6) 105
             107:   26(fvec4) Load 82(H_siz04c)
             108:     55(ptr) AccessChain 92(_uniformSharedData) 52 13
             109:   26(fvec4) Load 108
             110:    6(float) Dot 107 109
                              Store 106(dotres7) 110
             112:    6(float) Load 88(dotres4)
             113:    6(float) Load 96(dotres5)
             114:    6(float) Load 101(dotres6)
             115:    6(float) Load 106(dotres7)
             116:   26(fvec4) CompositeConstruct 112 113 114 115
                              Store 111(H_gg6lc3) 116
             121:   26(fvec4) Load 111(H_gg6lc3)
             123:    122(ptr) AccessChain 120 52
                              Store 123 121
             127:   29(fvec2) Load 126(gIn_VSIn_In_UV_1)
                              Store 125(gOut_VSOut_R_UV_1) 127
                              Return
                              FunctionEnd

Also, it seems that the actual error is from the internal NVIDIA SPIRV compiler? Is there any way to get the actual error messages instead of – error message – and – internal assembly text --?

It seems that I misunderstood the behaviour of std140, and if I understand it correctly now it will not pack variables together.

It will pack them together. Just apparently not the way you thought it would. You have to remember that vec3 always has 16-byte alignment. So its offset is 16.

If you want to pack a vec3 and an int into 16 bytes, the int has to come after the vec3, not before it.

Also, it’s really not a good idea to push limits to the closest byte like that. This is more important in OpenGL (since implementations are often required to hide things from you), but even in Vulkan, I wouldn’t trust it to work if I’m within 16 bytes of a 64KB limit.