Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GLSL: Implement GL_EXT_mesh_shader #2012

Merged
merged 4 commits into from
Sep 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion checkout_glslang_spirv_tools.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Copyright 2016-2021 The Khronos Group Inc.
# SPDX-License-Identifier: Apache-2.0

GLSLANG_REV=69ae9e7460499b488cb2d32edae623a95264db14
GLSLANG_REV=a53aa3e94f8b4bf22a6eb6e8a207fe91ab02b989
SPIRV_TOOLS_REV=4c456f7da67c5437a6fb7d4d20d78e2a5ae2acf2
SPIRV_HEADERS_REV=87d5b782bec60822aa878941e6b13c0a9a954c9b
PROTOCOL=https
Expand Down
4 changes: 4 additions & 0 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1082,6 +1082,10 @@ static ExecutionModel stage_to_execution_model(const std::string &stage)
return ExecutionModelMissKHR;
else if (stage == "rcall")
return ExecutionModelCallableKHR;
else if (stage == "mesh")
return spv::ExecutionModelMeshEXT;
else if (stage == "task")
return spv::ExecutionModelTaskEXT;
else
SPIRV_CROSS_THROW("Invalid stage.");
}
Expand Down
2 changes: 1 addition & 1 deletion reference/opt/shaders/frag/barycentric-khr.frag
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

layout(location = 0) out vec2 value;
layout(location = 0) pervertexEXT in vec2 vUV[3];
layout(location = 1) pervertexEXT in vec2 vUV2[3];
layout(location = 3) pervertexEXT in vec2 vUV2[3];

void main()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#version 450
#extension GL_EXT_mesh_shader : require
#extension GL_EXT_fragment_shading_rate : require
layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) in;
layout(max_vertices = 24, max_primitives = 22, lines) out;

out gl_MeshPerVertexEXT
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[1];
float gl_CullDistance[2];
} gl_MeshVerticesEXT[];

struct TaskPayload
{
float a;
float b;
int c;
};

layout(location = 0) out vec4 vOut[24];
layout(location = 2) out BlockOut
{
vec4 a;
vec4 b;
} outputs[24];

layout(location = 1) perprimitiveEXT out vec4 vPrim[22];
layout(location = 4) perprimitiveEXT out BlockOutPrim
{
vec4 a;
vec4 b;
} prim_outputs[22];

taskPayloadSharedEXT TaskPayload payload;
shared float shared_float[16];

void main()
{
SetMeshOutputsEXT(24u, 22u);
vec3 _29 = vec3(gl_GlobalInvocationID);
float _31 = _29.x;
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position = vec4(_31, _29.yz, 1.0);
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_PointSize = 2.0;
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_ClipDistance[0] = 4.0;
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_CullDistance[1] = 5.0;
vOut[gl_LocalInvocationIndex] = vec4(_31, _29.yz, 2.0);
outputs[gl_LocalInvocationIndex].a = vec4(5.0);
outputs[gl_LocalInvocationIndex].b = vec4(6.0);
barrier();
if (gl_LocalInvocationIndex < 22u)
{
vPrim[gl_LocalInvocationIndex] = vec4(vec3(gl_WorkGroupID), 3.0);
prim_outputs[gl_LocalInvocationIndex].a = vec4(payload.a);
prim_outputs[gl_LocalInvocationIndex].b = vec4(payload.b);
gl_PrimitiveLineIndicesEXT[gl_LocalInvocationIndex] = uvec2(0u, 1u) + uvec2(gl_LocalInvocationIndex);
int _129 = int(gl_GlobalInvocationID.x);
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_PrimitiveID = _129;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_Layer = _129 + 1;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_ViewportIndex = _129 + 2;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_CullPrimitiveEXT = (gl_GlobalInvocationID.x & 1u) != 0u;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_PrimitiveShadingRateEXT = _129 + 3;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#version 450
#extension GL_EXT_mesh_shader : require
#extension GL_EXT_fragment_shading_rate : require
layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) in;
layout(max_vertices = 24, max_primitives = 22, points) out;

out gl_MeshPerVertexEXT
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[1];
float gl_CullDistance[2];
} gl_MeshVerticesEXT[];

struct TaskPayload
{
float a;
float b;
int c;
};

layout(location = 0) out vec4 vOut[24];
layout(location = 2) out BlockOut
{
vec4 a;
vec4 b;
} outputs[24];

layout(location = 1) perprimitiveEXT out vec4 vPrim[22];
layout(location = 4) perprimitiveEXT out BlockOutPrim
{
vec4 a;
vec4 b;
} prim_outputs[22];

taskPayloadSharedEXT TaskPayload payload;
shared float shared_float[16];

void main()
{
SetMeshOutputsEXT(24u, 22u);
vec3 _29 = vec3(gl_GlobalInvocationID);
float _31 = _29.x;
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position = vec4(_31, _29.yz, 1.0);
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_PointSize = 2.0;
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_ClipDistance[0] = 4.0;
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_CullDistance[1] = 5.0;
vOut[gl_LocalInvocationIndex] = vec4(_31, _29.yz, 2.0);
outputs[gl_LocalInvocationIndex].a = vec4(5.0);
outputs[gl_LocalInvocationIndex].b = vec4(6.0);
barrier();
if (gl_LocalInvocationIndex < 22u)
{
vPrim[gl_LocalInvocationIndex] = vec4(vec3(gl_WorkGroupID), 3.0);
prim_outputs[gl_LocalInvocationIndex].a = vec4(payload.a);
prim_outputs[gl_LocalInvocationIndex].b = vec4(payload.b);
gl_PrimitivePointIndicesEXT[gl_LocalInvocationIndex] = gl_LocalInvocationIndex;
int _124 = int(gl_GlobalInvocationID.x);
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_PrimitiveID = _124;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_Layer = _124 + 1;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_ViewportIndex = _124 + 2;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_CullPrimitiveEXT = (gl_GlobalInvocationID.x & 1u) != 0u;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_PrimitiveShadingRateEXT = _124 + 3;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#version 450
#extension GL_EXT_mesh_shader : require
#extension GL_EXT_fragment_shading_rate : require
layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) in;
layout(max_vertices = 24, max_primitives = 22, triangles) out;

out gl_MeshPerVertexEXT
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[1];
float gl_CullDistance[2];
} gl_MeshVerticesEXT[];

struct TaskPayload
{
float a;
float b;
int c;
};

layout(location = 0) out vec4 vOut[24];
layout(location = 2) out BlockOut
{
vec4 a;
vec4 b;
} outputs[24];

layout(location = 1) perprimitiveEXT out vec4 vPrim[22];
layout(location = 4) perprimitiveEXT out BlockOutPrim
{
vec4 a;
vec4 b;
} prim_outputs[22];

taskPayloadSharedEXT TaskPayload payload;
shared float shared_float[16];

void main()
{
SetMeshOutputsEXT(24u, 22u);
vec3 _29 = vec3(gl_GlobalInvocationID);
float _31 = _29.x;
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position = vec4(_31, _29.yz, 1.0);
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_PointSize = 2.0;
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_ClipDistance[0] = 4.0;
gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_CullDistance[1] = 5.0;
vOut[gl_LocalInvocationIndex] = vec4(_31, _29.yz, 2.0);
outputs[gl_LocalInvocationIndex].a = vec4(5.0);
outputs[gl_LocalInvocationIndex].b = vec4(6.0);
barrier();
if (gl_LocalInvocationIndex < 22u)
{
vPrim[gl_LocalInvocationIndex] = vec4(vec3(gl_WorkGroupID), 3.0);
prim_outputs[gl_LocalInvocationIndex].a = vec4(payload.a);
prim_outputs[gl_LocalInvocationIndex].b = vec4(payload.b);
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex] = uvec3(0u, 1u, 2u) + uvec3(gl_LocalInvocationIndex);
int _128 = int(gl_GlobalInvocationID.x);
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_PrimitiveID = _128;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_Layer = _128 + 1;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_ViewportIndex = _128 + 2;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_CullPrimitiveEXT = (gl_GlobalInvocationID.x & 1u) != 0u;
gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_PrimitiveShadingRateEXT = _128 + 3;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#version 450
#extension GL_EXT_mesh_shader : require
layout(local_size_x = 4, local_size_y = 3, local_size_z = 2) in;

struct Payload
{
float v[3];
};

shared float vs[24];
taskPayloadSharedEXT Payload p;

void main()
{
vs[gl_LocalInvocationIndex] = 10.0;
barrier();
if (gl_LocalInvocationIndex < 12u)
{
vs[gl_LocalInvocationIndex] += vs[gl_LocalInvocationIndex + 12u];
}
barrier();
if (gl_LocalInvocationIndex < 6u)
{
vs[gl_LocalInvocationIndex] += vs[gl_LocalInvocationIndex + 6u];
}
barrier();
if (gl_LocalInvocationIndex < 3u)
{
vs[gl_LocalInvocationIndex] += vs[gl_LocalInvocationIndex + 3u];
}
barrier();
p.v[gl_LocalInvocationIndex] = vs[gl_LocalInvocationIndex];
if (vs[5] > 20.0)
{
EmitMeshTasksEXT(uint(int(vs[4])), uint(int(vs[6])), uint(int(vs[8])));
}
else
{
EmitMeshTasksEXT(uint(int(vs[6])), 10u, 50u);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#version 450
#extension GL_EXT_mesh_shader : require
layout(local_size_x = 4, local_size_y = 3, local_size_z = 2) in;

struct Payload
{
float v[3];
};

shared float vs[24];
taskPayloadSharedEXT Payload p;

void main()
{
vs[gl_LocalInvocationIndex] = 10.0;
barrier();
if (gl_LocalInvocationIndex < 12u)
{
vs[gl_LocalInvocationIndex] += vs[gl_LocalInvocationIndex + 12u];
}
barrier();
if (gl_LocalInvocationIndex < 6u)
{
vs[gl_LocalInvocationIndex] += vs[gl_LocalInvocationIndex + 6u];
}
barrier();
if (gl_LocalInvocationIndex < 3u)
{
vs[gl_LocalInvocationIndex] += vs[gl_LocalInvocationIndex + 3u];
}
barrier();
p.v[gl_LocalInvocationIndex] = vs[gl_LocalInvocationIndex];
EmitMeshTasksEXT(uint(int(vs[4])), uint(int(vs[6])), uint(int(vs[8])));
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#version 450
#extension GL_EXT_mesh_shader : require
layout(local_size_x = 4, local_size_y = 3, local_size_z = 2) in;

struct Payload
{
float v[3];
};

shared float vs[24];
taskPayloadSharedEXT Payload p;

void main()
{
vs[gl_LocalInvocationIndex] = 10.0;
barrier();
if (gl_LocalInvocationIndex < 12u)
{
vs[gl_LocalInvocationIndex] += vs[gl_LocalInvocationIndex + 12u];
}
barrier();
if (gl_LocalInvocationIndex < 6u)
{
vs[gl_LocalInvocationIndex] += vs[gl_LocalInvocationIndex + 6u];
}
barrier();
if (gl_LocalInvocationIndex < 3u)
{
vs[gl_LocalInvocationIndex] += vs[gl_LocalInvocationIndex + 3u];
}
barrier();
p.v[gl_LocalInvocationIndex] = vs[gl_LocalInvocationIndex];
EmitMeshTasksEXT(uint(int(vs[4])), uint(int(vs[6])), uint(int(vs[8])));
}

2 changes: 1 addition & 1 deletion reference/shaders/frag/barycentric-khr.frag
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

layout(location = 0) out vec2 value;
layout(location = 0) pervertexEXT in vec2 vUV[3];
layout(location = 1) pervertexEXT in vec2 vUV2[3];
layout(location = 3) pervertexEXT in vec2 vUV2[3];

void main()
{
Expand Down
Loading