From 707312b83a79cf83d7b367553b2dee6f8a21a808 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Thu, 13 Jun 2019 11:33:19 +0200 Subject: [PATCH] GLSL: Support NV barycentrics. --- .../opt/shaders/frag/barycentric-nv.frag | 19 ++++++++++++++++++ reference/shaders/frag/barycentric-nv.frag | 20 +++++++++++++++++++ shaders/frag/barycentric-nv.frag | 18 +++++++++++++++++ spirv_glsl.cpp | 20 +++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 reference/opt/shaders/frag/barycentric-nv.frag create mode 100644 reference/shaders/frag/barycentric-nv.frag create mode 100644 shaders/frag/barycentric-nv.frag diff --git a/reference/opt/shaders/frag/barycentric-nv.frag b/reference/opt/shaders/frag/barycentric-nv.frag new file mode 100644 index 00000000..cc3b4de2 --- /dev/null +++ b/reference/opt/shaders/frag/barycentric-nv.frag @@ -0,0 +1,19 @@ +#version 450 +#extension GL_NV_fragment_shader_barycentric : require + +layout(binding = 0, std430) readonly buffer Vertices +{ + vec2 uvs[]; +} _19; + +layout(location = 0) out vec2 value; + +void main() +{ + int _23 = 3 * gl_PrimitiveID; + int _32 = _23 + 1; + int _39 = _23 + 2; + value = ((_19.uvs[_23] * gl_BaryCoordNV.x) + (_19.uvs[_32] * gl_BaryCoordNV.y)) + (_19.uvs[_39] * gl_BaryCoordNV.z); + value += (((_19.uvs[_23] * gl_BaryCoordNoPerspNV.x) + (_19.uvs[_32] * gl_BaryCoordNoPerspNV.y)) + (_19.uvs[_39] * gl_BaryCoordNoPerspNV.z)); +} + diff --git a/reference/shaders/frag/barycentric-nv.frag b/reference/shaders/frag/barycentric-nv.frag new file mode 100644 index 00000000..12d24bb7 --- /dev/null +++ b/reference/shaders/frag/barycentric-nv.frag @@ -0,0 +1,20 @@ +#version 450 +#extension GL_NV_fragment_shader_barycentric : require + +layout(binding = 0, std430) readonly buffer Vertices +{ + vec2 uvs[]; +} _19; + +layout(location = 0) out vec2 value; + +void main() +{ + int prim = gl_PrimitiveID; + vec2 uv0 = _19.uvs[(3 * prim) + 0]; + vec2 uv1 = _19.uvs[(3 * prim) + 1]; + vec2 uv2 = _19.uvs[(3 * prim) + 2]; + value = ((uv0 * gl_BaryCoordNV.x) + (uv1 * gl_BaryCoordNV.y)) + (uv2 * gl_BaryCoordNV.z); + value += (((uv0 * gl_BaryCoordNoPerspNV.x) + (uv1 * gl_BaryCoordNoPerspNV.y)) + (uv2 * gl_BaryCoordNoPerspNV.z)); +} + diff --git a/shaders/frag/barycentric-nv.frag b/shaders/frag/barycentric-nv.frag new file mode 100644 index 00000000..34040837 --- /dev/null +++ b/shaders/frag/barycentric-nv.frag @@ -0,0 +1,18 @@ +#version 450 +#extension GL_NV_fragment_shader_barycentric : require + +layout(location = 0) out vec2 value; + +layout(set = 0, binding = 0) readonly buffer Vertices +{ + vec2 uvs[]; +}; + +void main () { + int prim = gl_PrimitiveID; + vec2 uv0 = uvs[3 * prim + 0]; + vec2 uv1 = uvs[3 * prim + 1]; + vec2 uv2 = uvs[3 * prim + 2]; + value = gl_BaryCoordNV.x * uv0 + gl_BaryCoordNV.y * uv1 + gl_BaryCoordNV.z * uv2; + value += gl_BaryCoordNoPerspNV.x * uv0 + gl_BaryCoordNoPerspNV.y * uv1 + gl_BaryCoordNoPerspNV.z * uv2; +} diff --git a/spirv_glsl.cpp b/spirv_glsl.cpp index b4d888ad..9d1d9943 100644 --- a/spirv_glsl.cpp +++ b/spirv_glsl.cpp @@ -6156,6 +6156,26 @@ string CompilerGLSL::builtin_to_glsl(BuiltIn builtin, StorageClass storage) case BuiltInIncomingRayFlagsNV: return "gl_IncomingRayFlagsNV"; + case BuiltInBaryCoordNV: + { + if (options.es && options.version < 320) + SPIRV_CROSS_THROW("gl_BaryCoordNV requires ESSL 320."); + else if (!options.es && options.version < 450) + SPIRV_CROSS_THROW("gl_BaryCoordNV requires GLSL 450."); + require_extension_internal("GL_NV_fragment_shader_barycentric"); + return "gl_BaryCoordNV"; + } + + case BuiltInBaryCoordNoPerspNV: + { + if (options.es && options.version < 320) + SPIRV_CROSS_THROW("gl_BaryCoordNoPerspNV requires ESSL 320."); + else if (!options.es && options.version < 450) + SPIRV_CROSS_THROW("gl_BaryCoordNoPerspNV requires GLSL 450."); + require_extension_internal("GL_NV_fragment_shader_barycentric"); + return "gl_BaryCoordNoPerspNV"; + } + case BuiltInFragStencilRefEXT: { if (!options.es)