From 1b6af030f79662b159628a3b7c9dd7a75b4e06f9 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Mon, 10 Jul 2017 12:17:36 -0700 Subject: Add GLSL translations for many `SV_*` semantics I haven't tried to be 100% exhaustie, but this should cover the main cases we are likely to encounter in library code. --- source/slang/lower.cpp | 126 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 123 insertions(+), 3 deletions(-) (limited to 'source/slang/lower.cpp') diff --git a/source/slang/lower.cpp b/source/slang/lower.cpp index fa38264d4..d77e573d4 100644 --- a/source/slang/lower.cpp +++ b/source/slang/lower.cpp @@ -1531,6 +1531,14 @@ struct LoweringVisitor VaryingParameterArraySpec* arraySpecs = nullptr; }; + RefPtr createGLSLBuiltinRef( + char const* name) + { + RefPtr globalVarRef = new VarExpressionSyntaxNode(); + globalVarRef->name = name; + return globalVarRef; + } + void lowerSimpleShaderParameterToGLSLGlobal( VaryingParameterInfo const& info, @@ -1570,9 +1578,121 @@ struct LoweringVisitor } else if (ns == "sv_position") { - RefPtr globalVarRef = new VarExpressionSyntaxNode(); - globalVarRef->name = "gl_Position"; - globalVarExpr = globalVarRef; + if (info.direction == VaryingParameterDirection::Input) + { + globalVarExpr = createGLSLBuiltinRef("gl_FragCoord"); + } + else + { + globalVarExpr = createGLSLBuiltinRef("gl_Position"); + } + } + else if (ns == "sv_clipdistance") + { + globalVarExpr = createGLSLBuiltinRef("gl_ClipDistance"); + } + else if (ns == "sv_culldistance") + { + // TODO: ARB_cull_distance + globalVarExpr = createGLSLBuiltinRef("gl_CullDistance"); + } + else if (ns == "sv_coverage") + { + if (info.direction == VaryingParameterDirection::Input) + { + globalVarExpr = createGLSLBuiltinRef("gl_SampleMaskIn"); + } + else + { + globalVarExpr = createGLSLBuiltinRef("gl_SampleMask"); + } + } + else if (ns == "sv_depth") + { + globalVarExpr = createGLSLBuiltinRef("gl_FragDepth"); + } + else if (ns == "sv_depthgreaterequal") + { + // TODO: layout(depth_greater) out float gl_FragDepth; + globalVarExpr = createGLSLBuiltinRef("gl_FragDepth"); + } + else if (ns == "sv_depthlessequal") + { + // TODO: layout(depth_less) out float gl_FragDepth; + globalVarExpr = createGLSLBuiltinRef("gl_FragDepth"); + } + else if (ns == "sv_dispatchthreadid") + { + globalVarExpr = createGLSLBuiltinRef("gl_GlobalInvocationID"); + } + else if (ns == "sv_domainlocation") + { + globalVarExpr = createGLSLBuiltinRef("gl_TessCoord"); + } + else if (ns == "sv_groupid") + { + globalVarExpr = createGLSLBuiltinRef("gl_WorkGroupID"); + } + else if (ns == "sv_groupindex") + { + globalVarExpr = createGLSLBuiltinRef("gl_LocationInvocationIndex"); + } + else if (ns == "sv_groupthreadid") + { + globalVarExpr = createGLSLBuiltinRef("gl_LocalInvocationID"); + } + else if (ns == "sv_gsinstanceid") + { + globalVarExpr = createGLSLBuiltinRef("gl_InvocationID"); + } + else if (ns == "sv_insidetessfactor") + { + globalVarExpr = createGLSLBuiltinRef("gl_TessLevelInner"); + } + else if (ns == "sv_instanceid") + { + globalVarExpr = createGLSLBuiltinRef("gl_InstanceIndex"); + } + else if (ns == "sv_isfrontface") + { + globalVarExpr = createGLSLBuiltinRef("gl_FrontFacing"); + } + else if (ns == "sv_outputcontrolpointid") + { + globalVarExpr = createGLSLBuiltinRef("gl_InvocationID"); + } + else if (ns == "sv_outputcontrolpointid") + { + globalVarExpr = createGLSLBuiltinRef("gl_InvocationID"); + } + else if (ns == "sv_primitiveid") + { + globalVarExpr = createGLSLBuiltinRef("gl_PrimitiveID"); + } + else if (ns == "sv_rendertargetarrayindex") + { + globalVarExpr = createGLSLBuiltinRef("gl_Layer"); + } + else if (ns == "sv_sampleindex") + { + globalVarExpr = createGLSLBuiltinRef("gl_SampleID"); + } + else if (ns == "sv_stencilref") + { + // TODO: ARB_shader_stencil_export + globalVarExpr = createGLSLBuiltinRef("gl_SampleID"); + } + else if (ns == "sv_tessfactor") + { + globalVarExpr = createGLSLBuiltinRef("gl_TessLevelOuter"); + } + else if (ns == "sv_vertexid") + { + globalVarExpr = createGLSLBuiltinRef("gl_VertexIndex"); + } + else if (ns == "sv_viewportarrayindex") + { + globalVarExpr = createGLSLBuiltinRef("gl_ViewportIndex"); } else { -- cgit v1.2.3