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?