Internal error: assembly compile error for tessellation evaluation shader at offset

I’m getting the following error when trying to link my shader program:

Tessellation evaluation info
----------------------------
Internal error: assembly compile error for tessellation evaluation shader at offset 1150:
-- error message --
line 29, column 63:  error: invalid generic patch attribute number
line 97, column 43:  error: invalid generic patch attribute number
line 103, column 43:  error: invalid generic patch attribute number
-- internal assembly text --
!!NVtep5.0
OPTION NV_bindless_texture;
TESS_MODE QUADS;
TESS_SPACING EQUAL;
TESS_VERTEX_ORDER CCW;
# cgc version 3.4.0001, build date Mar  7 2016
# command line args: 
#vendor NVIDIA Corporation
#version 3.4.0.1
#profile gp5tp
#program main
#semantic uni_v
#semantic uni_p
#semantic uni_vp
#semantic uni_cameraposition_ms
#var float4 gl_Position : $vout.POSITION : HPOS[32] : -1 : 1
#var float3 gl_TessCoord : $vin.TESSCOORD : TESSCOORD[58] : -1 : 1
#var float3 patch_in.position[0][0] : $ppvin.ATTR00 : ATTR0[0] : -1 : 1
#var float2 patch_in.texcoord[0][0] : $ppvin.ATTR99 : ATTR9[9] : -1 : 1
#var float3 patch_in.normal[0][0] : $ppvin.ATTR1818 : ATTR18[18] : -1 : 1
#var float2 patch_in.lightmap[0][0] : $ppvin.ATTR2727 : ATTR27[27] : -1 : 1
#var float4 vertex_out.texcoord : $vout.ATTR0 : ATTR0[0] : -1 : 1
#var float3 vertex_out.normal : $vout.ATTR1.xyz : ATTR1[1] : -1 : 1
#var float4x4 uni_v :  : c[0], 4 : -1 : 1
#var float4x4 uni_p :  : c[4], 4 : -1 : 1
#var float4x4 uni_vp :  : , 4 : -1 : 0
#var float3 uni_cameraposition_ms :  :  : -1 : 0
PARAM c[8] = { program.local[0..7] };
ATTRIB primitive_patch_attrib[] = { primitive.patch.attrib[0..31] };
OUTPUT result_position = result.position;
OUTPUT result_attrib[] = { result.attrib[0..1] };
TEMP R0, R1, R2, R3, R4;
ADD.F R0.w, -vertex.tesscoord.x, {1, 0, 0, 0}.x;
MUL.F R2.x, vertex.tesscoord, R0.w;
MUL.F R1.w, R0, R0;
ADD.F R0.w, -vertex.tesscoord.y, {1, 0, 0, 0}.x;
MUL.F R1.xyz, R2.x, primitive.patch.attrib[4];
MUL.F R0.xyz, R2.x, primitive.patch.attrib[5];
MUL.F R0.xyz, R0, {2, 0, 0, 0}.x;
MUL.F R3.xyz, R2.x, primitive.patch.attrib[3];
MUL.F R2.z, vertex.tesscoord.x, vertex.tesscoord.x;
MAD.F R0.xyz, R1.w, primitive.patch.attrib[2], R0;
MUL.F R2.y, vertex.tesscoord, R0.w;
MUL.F R2.w, R0, R0;
MUL.F R4.xyz, R1, {2, 0, 0, 0}.x;
MUL.F R3.xyz, R3, {2, 0, 0, 0}.x;
MAD.F R1.xyz, R1.w, primitive.patch.attrib[0], R3;
MAD.F R3.xyz, R1.w, primitive.patch.attrib[1], R4;
MAD.F R3.xyz, R2.z, primitive.patch.attrib[7], R3;
MUL.F R3.xyz, R2.y, R3;
MUL.F R3.xyz, R3, {2, 0, 0, 0}.x;
MAD.F R1.xyz, R2.z, primitive.patch.attrib[6], R1;
MAD.F R1.xyz, R2.w, R1, R3;
MUL.F R3.x, vertex.tesscoord.y, vertex.tesscoord.y;
MAD.F R0.xyz, R2.z, primitive.patch.attrib[8], R0;
MAD.F R1.xyz, R3.x, R0, R1;
MUL.F R0, R1.y, c[1];
MAD.F R0, R1.x, c[0], R0;
MAD.F R0, R1.z, c[2], R0;
ADD.F R0, R0, c[3];
MUL.F R4, R0.y, c[5];
MAD.F R4, R0.x, c[4], R4;
MAD.F R4, R0.z, c[6], R4;
MUL.F R0.xyz, R2.x, primitive.patch.attrib[22];
MUL.F R1.xyz, R2.x, primitive.patch.attrib[23];
MAD.F result.position, R0.w, c[7], R4;
MUL.F R3.yzw, R0.xxyz, {2, 0, 0, 0}.x;
MUL.F R1.xyz, R1, {2, 0, 0, 0}.x;
MAD.F R0.xyz, R1.w, primitive.patch.attrib[20], R1;
MAD.F R1.xyz, R1.w, primitive.patch.attrib[19], R3.yzww;
MUL.F R3.yzw, R2.x, primitive.patch.attrib[21].xxyz;
MAD.F R1.xyz, R2.z, primitive.patch.attrib[25], R1;
MUL.F R3.yzw, R3, {2, 0, 0, 0}.x;
MUL.F R1.xyz, R2.y, R1;
MAD.F R3.yzw, R1.w, primitive.patch.attrib[18].xxyz, R3;
MAD.F R0.xyz, R2.z, primitive.patch.attrib[26], R0;
MUL.F R1.xyz, R1, {2, 0, 0, 0}.x;
MAD.F R4.xyz, R2.z, primitive.patch.attrib[24], R3.yzww;
MAD.F R1.xyz, R2.w, R4, R1;
MAD.F result.attrib[1].xyz, R3.x, R0, R1;
MUL.F R0.xy, R2.x, primitive.patch.attrib[13];
MUL.F R0.zw, R2.x, primitive.patch.attrib[14].xyxy;
MUL.F R1.xy, R0, {2, 0, 0, 0}.x;
MUL.F R0.zw, R0, {2, 0, 0, 0}.x;
MAD.F R0.xy, R1.w, primitive.patch.attrib[11], R0.zwzw;
MAD.F R0.zw, R1.w, primitive.patch.attrib[10].xyxy, R1.xyxy;
MUL.F R1.xy, R2.x, primitive.patch.attrib[12];
MAD.F R0.zw, R2.z, primitive.patch.attrib[16].xyxy, R0;
MUL.F R1.xy, R1, {2, 0, 0, 0}.x;
MUL.F R0.zw, R2.y, R0;
MAD.F R1.xy, R1.w, primitive.patch.attrib[9], R1;
MAD.F R1.xy, R2.z, primitive.patch.attrib[15], R1;
MUL.F R0.zw, R0, {2, 0, 0, 0}.x;
MAD.F R0.zw, R2.w, R1.xyxy, R0;
MAD.F R0.xy, R2.z, primitive.patch.attrib[17], R0;
MAD.F result.attrib[0].xy, R3.x, R0, R0.zwzw;
MUL.F R0.xy, R2.x, primitive.patch.attrib[31];
MUL.F R1.xy, R0, {2, 0, 0, 0}.x;
MUL.F R0.zw, R2.x, primitive.patch.attrib[9];
MUL.F R0.zw, R0, {2, 0, 0, 0}.x;
MAD.F R0.xy, R1.w, primitive.patch.attrib[29], R0.zwzw;
MAD.F R1.xy, R1.w, primitive.patch.attrib[28], R1;
MUL.F R0.zw, R2.x, primitive.patch.attrib[30].xyxy;
MAD.F R1.xy, R2.z, primitive.patch.attrib[11].zwzw, R1;
MUL.F R0.zw, R0, {2, 0, 0, 0}.x;
MUL.F R1.xy, R2.y, R1;
MAD.F R0.zw, R1.w, primitive.patch.attrib[27].xyxy, R0;
MUL.F R1.xy, R1, {2, 0, 0, 0}.x;
MAD.F R0.zw, R2.z, primitive.patch.attrib[10], R0;
MAD.F R0.zw, R2.w, R0, R1.xyxy;
MAD.F R0.xy, R2.z, primitive.patch.attrib[12].zwzw, R0;
MAD.F result.attrib[0].zw, R3.x, R0.xyxy, R0;
END
# 80 instructions, 5 R-regs

Here’s the tessellation eval shader:

#version 440 core

//#pragma debug(on)

// layout
layout (quads, equal_spacing, ccw) in;

// uniforms
layout(location=0)uniform mat4 uni_v;
layout(location=1)uniform mat4 uni_p;
layout(location=2)uniform mat4 uni_vp;
layout(location=3)uniform vec3 uni_cameraposition_ms;

// in
patch in TC_TE_PATCH
{
	vec3 position[3][3];
	vec2 texcoord[3][3];
	vec3 normal[3][3];
	vec2 lightmap[3][3];
} patch_in;

//in patch TC_TE_PATCH patch_in;

// out
out TE_FS_VERTEX
{
	vec4 texcoord;
	vec3 normal;
} vertex_out;

vec3 get_position()
{
	float u = gl_TessCoord.x;
	float uinv = 1 - u;
	float v = gl_TessCoord.y;
	float vinv = 1 - v;

	vec3 p_u0 = (uinv*uinv)*patch_in.position[0][0] + 2*(uinv)*u*patch_in.position[1][0] + (u*u)*patch_in.position[2][0];
	vec3 p_u1 = (uinv*uinv)*patch_in.position[0][1] + 2*(uinv)*u*patch_in.position[1][1] + (u*u)*patch_in.position[2][1];
	vec3 p_u2 = (uinv*uinv)*patch_in.position[0][2] + 2*(uinv)*u*patch_in.position[1][2] + (u*u)*patch_in.position[2][2];

	vec3 p_uv = (vinv*vinv)*p_u0 + 2*vinv*v*p_u1 + (v*v)*p_u2;

	return(p_uv);
}

vec2 get_texcoord()
{
	float u = gl_TessCoord.x;
	float uinv = 1 - u;
	float v = gl_TessCoord.y;
	float vinv = 1 - v;

	vec2 t_u0 = (uinv*uinv)*patch_in.texcoord[0][0] + 2*(uinv)*u*patch_in.texcoord[1][0] + (u*u)*patch_in.texcoord[2][0];
	vec2 t_u1 = (uinv*uinv)*patch_in.texcoord[0][1] + 2*(uinv)*u*patch_in.texcoord[1][1] + (u*u)*patch_in.texcoord[2][1];
	vec2 t_u2 = (uinv*uinv)*patch_in.texcoord[0][2] + 2*(uinv)*u*patch_in.texcoord[1][2] + (u*u)*patch_in.texcoord[2][2];

	vec2 t_uv = (vinv*vinv)*t_u0 + 2*vinv*v*t_u1 + (v*v)*t_u2;

	return(t_uv);
}

vec3 get_normal()
{
	float u = gl_TessCoord.x;
	float uinv = 1 - u;
	float v = gl_TessCoord.y;
	float vinv = 1 - v;

	vec3 n_u0 = (uinv*uinv)*patch_in.normal[0][0] + 2*(uinv)*u*patch_in.normal[1][0] + (u*u)*patch_in.normal[2][0];
	vec3 n_u1 = (uinv*uinv)*patch_in.normal[0][1] + 2*(uinv)*u*patch_in.normal[1][1] + (u*u)*patch_in.normal[2][1];
	vec3 n_u2 = (uinv*uinv)*patch_in.normal[0][2] + 2*(uinv)*u*patch_in.normal[1][2] + (u*u)*patch_in.normal[2][2];

	vec3 n_uv = (vinv*vinv)*n_u0 + 2*vinv*v*n_u1 + (v*v)*n_u2;

	return(n_uv);
}

vec2 get_lightmap()
{
	float u = gl_TessCoord.x;
	float uinv = 1 - u;
	float v = gl_TessCoord.y;
	float vinv = 1 - v;

	vec2 l_u0 = (uinv*uinv)*patch_in.lightmap[0][0] + 2*(uinv)*u*patch_in.lightmap[1][0] + (u*u)*patch_in.lightmap[2][0];
	vec2 l_u1 = (uinv*uinv)*patch_in.lightmap[0][1] + 2*(uinv)*u*patch_in.lightmap[1][1] + (u*u)*patch_in.lightmap[2][1];
	vec2 l_u2 = (uinv*uinv)*patch_in.lightmap[0][2] + 2*(uinv)*u*patch_in.lightmap[1][2] + (u*u)*patch_in.lightmap[2][2];

	vec2 l_uv = (vinv*vinv)*l_u0 + 2*vinv*v*l_u1 + (v*v)*l_u2;

	return(l_uv);
}

void main()
{
	

	//

	vertex_out.texcoord = vec4(get_texcoord(), get_lightmap());
	vertex_out.normal = get_normal();

	gl_Position = (uni_p * uni_v) * vec4(get_position(), 1.0);
}

Any idea what I’m doing wrong or how to fix it? Is the shader just too complicated or something?

Seems like I was just trying to pass too much vertex data through so I tried rewriting it to store the patch data in an SSBO instead and only pass an index through as a vertex and it works fine now, nevermind =)

#version 440 core

#pragma debug(on)

// layout
layout (quads, equal_spacing, ccw) in;

// uniforms
layout(location=0)uniform mat4 uni_v;
layout(location=1)uniform mat4 uni_p;
layout(location=2)uniform mat4 uni_vp;
layout(location=3)uniform vec3 uni_cameraposition_ms;

// Patch
struct patch_data
{
	vec4 position[3][3];
	vec4 texcoord[3][3];
	vec4 normal[3][3];
	vec4 lightmap[3][3];
	vec4 color[3][3];
};

// shader storage
layout(std140, binding = 0) buffer patch_buffer
{
	patch_data patches[];
};

// in
patch in TC_TE_PATCH
{
	float id;
} patch_in;

// out
out TE_FS_VERTEX
{
	vec3 position;
	vec2 texcoord;
	vec3 normal;
	vec2 lightmap;
	vec3 color;
} vertex_out;

vec4 quadratic(vec2 p, vec4 q[3][3])
{
	float u = p.x;
	float uinv = 1 - u;
	float v = p.y;
	float vinv = 1 - v;

	vec4 p_u[3];
	for(int i = 0; i < 3; i++)
	{
		p_u[i] = (uinv*uinv)*q[0][i] + 2*(uinv)*u*q[1][i] + (u*u)*q[2][i];
	}

	vec4 p_uv = (vinv*vinv)*p_u[0] + 2*vinv*v*p_u[1] + (v*v)*p_u[2];

	return(p_uv);
}

void main()
{
	int id = int(patch_in.id);
	vertex_out.position = quadratic(gl_TessCoord.xy, patches[id].position).xyz;
	vertex_out.texcoord = quadratic(gl_TessCoord.xy, patches[id].texcoord).xy;
	vertex_out.normal = quadratic(gl_TessCoord.xy, patches[id].normal).xyz;
	vertex_out.lightmap = quadratic(gl_TessCoord.xy, patches[id].lightmap).xy;
	vertex_out.color = quadratic(gl_TessCoord.xy, patches[id].color).xyz;

	gl_Position = (uni_p * uni_v) * vec4(vertex_out.position, 1.0);
}