summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/glsl.meta.slang31
-rw-r--r--source/slang/slang-emit-c-like.cpp4
-rw-r--r--source/slang/slang-emit-spirv.cpp9
-rw-r--r--source/slang/slang-ir-glsl-legalize.cpp54
-rw-r--r--source/slang/slang-ir-insts.h3
-rw-r--r--source/slang/slang-ir-legalize-varying-params.cpp4
-rw-r--r--source/slang/slang-ir-legalize-varying-params.h2
-rw-r--r--source/slang/slang-ir-spirv-legalize.cpp2
8 files changed, 100 insertions, 9 deletions
diff --git a/source/slang/glsl.meta.slang b/source/slang/glsl.meta.slang
index 2d9078855..588396251 100644
--- a/source/slang/glsl.meta.slang
+++ b/source/slang/glsl.meta.slang
@@ -159,6 +159,9 @@ public property uint3 gl_WorkGroupSize
public in int gl_InvocationID : SV_GSInstanceID;
internal in int __sv_InstanceIndex : SV_InstanceID;
+internal in int __sv_VertexIndex : SV_VertexID;
+internal in int __sv_VulkanInstanceIndex : SV_VulkanInstanceID;
+internal in int __sv_VulkanVertexIndex : SV_VulkanVertexID;
// SPIRV InstanceIndex builtin for vertex shader
public property int gl_InstanceIndex
@@ -168,24 +171,42 @@ public property int gl_InstanceIndex
{
__target_switch
{
+ case glsl:
+ case spirv:
+ case metal:
+ case wgsl:
+ return __sv_VulkanInstanceIndex;
default:
return __sv_InstanceIndex;
+ }
+ }
+}
+
+// SPIRV VertexIndex builtin for vertex shader
+public property int gl_VertexIndex
+{
+ [require(vertex)]
+ get
+ {
+ __target_switch
+ {
case glsl:
- __intrinsic_asm "gl_InstanceIndex";
case spirv:
- return spirv_asm {
- result:$$int = OpLoad builtin(InstanceIndex:int);
- };
+ case metal:
+ case wgsl:
+ return __sv_VulkanVertexIndex;
+ default:
+ return __sv_VertexIndex;
}
}
}
+
public in bool gl_FrontFacing : SV_IsFrontFace;
// TODO: define overload for geometry stage.
public in int gl_Layer : SV_RenderTargetArrayIndex;
public in int gl_SampleID : SV_SampleIndex;
-public in int gl_VertexIndex : SV_VertexID;
public in int gl_ViewIndex : SV_ViewID;
public in int gl_ViewportIndex : SV_ViewportArrayIndex;
public in int gl_BaseVertex : SV_StartVertexLocation;
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp
index b2dc9b014..26b964d6e 100644
--- a/source/slang/slang-emit-c-like.cpp
+++ b/source/slang/slang-emit-c-like.cpp
@@ -351,6 +351,10 @@ String CLikeSourceEmitter::getTargetBuiltinVarName(IRInst* inst, IRTargetBuiltin
return "gl_InstanceIndex";
case IRTargetBuiltinVarName::SpvBaseInstance:
return "gl_BaseInstance";
+ case IRTargetBuiltinVarName::SpvVertexIndex:
+ return "gl_VertexIndex";
+ case IRTargetBuiltinVarName::SpvBaseVertex:
+ return "gl_BaseVertex";
}
if (auto linkage = inst->findDecoration<IRLinkageDecoration>())
return linkage->getMangledName();
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index 5c1ccaf36..5dfa1c76c 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -5856,6 +5856,11 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
case IRTargetBuiltinVarName::SpvBaseInstance:
requireSPIRVCapability(SpvCapabilityDrawParameters);
return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInBaseInstance, inst);
+ case IRTargetBuiltinVarName::SpvVertexIndex:
+ return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInVertexIndex, inst);
+ case IRTargetBuiltinVarName::SpvBaseVertex:
+ requireSPIRVCapability(SpvCapabilityDrawParameters);
+ return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInBaseVertex, inst);
}
}
if (auto layout = getVarLayout(inst))
@@ -5948,7 +5953,7 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
{
return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInInvocationId, inst);
}
- else if (semanticName == "sv_instanceid")
+ else if (semanticName == "sv_vulkaninstanceid")
{
return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInInstanceIndex, inst);
}
@@ -6046,7 +6051,7 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
requireSPIRVCapability(SpvCapabilityTessellation);
return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInTessLevelInner, inst);
}
- else if (semanticName == "sv_vertexid")
+ else if (semanticName == "sv_vulkanvertexid")
{
return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInVertexIndex, inst);
}
diff --git a/source/slang/slang-ir-glsl-legalize.cpp b/source/slang/slang-ir-glsl-legalize.cpp
index 1223ea91c..c9791880f 100644
--- a/source/slang/slang-ir-glsl-legalize.cpp
+++ b/source/slang/slang-ir-glsl-legalize.cpp
@@ -630,6 +630,13 @@ GLSLSystemValueInfo* getGLSLSystemValueInfo(
context->requireGLSLVersion(ProfileVersion::GLSL_460);
context->requireGLSLExtension(toSlice("GL_ARB_shader_draw_parameters"));
}
+ else if (semanticName == "sv_vulkaninstanceid")
+ {
+ // https://docs.microsoft.com/en-us/windows/desktop/direct3d11/d3d10-graphics-programming-guide-input-assembler-stage-using#instanceid
+ // uint in hlsl, int in glsl
+ requiredType = builder->getBasicType(BaseType::Int);
+ name = "gl_InstanceIndex";
+ }
else if (semanticName == "sv_isfrontface")
{
// bool in hlsl & glsl
@@ -778,6 +785,16 @@ GLSLSystemValueInfo* getGLSLSystemValueInfo(
// uint in hlsl, int in glsl (https://www.khronos.org/opengl/wiki/Built-in_Variable_(GLSL))
requiredType = builder->getBasicType(BaseType::Int);
name = "gl_VertexIndex";
+ targetVarName = IRTargetBuiltinVarName::HlslVertexID;
+ context->requireSPIRVVersion(SemanticVersion(1, 3));
+ context->requireGLSLVersion(ProfileVersion::GLSL_460);
+ context->requireGLSLExtension(toSlice("GL_ARB_shader_draw_parameters"));
+ }
+ else if (semanticName == "sv_vulkanvertexid")
+ {
+ // uint in hlsl, int in glsl (https://www.khronos.org/opengl/wiki/Built-in_Variable_(GLSL))
+ requiredType = builder->getBasicType(BaseType::Int);
+ name = "gl_VertexIndex";
}
else if (semanticName == "sv_viewid")
{
@@ -1251,6 +1268,12 @@ void invokePathConstantFuncInHullShader(
fixUpFuncType(constantFunc);
}
+static bool targetBuiltinRequiresLegalization(IRTargetBuiltinVarName builtinVarName)
+{
+ return (builtinVarName == IRTargetBuiltinVarName::HlslInstanceID) ||
+ (builtinVarName == IRTargetBuiltinVarName::HlslVertexID);
+}
+
ScalarizedVal createSimpleGLSLGlobalVarying(
GLSLLegalizationContext* context,
CodeGenContext* codeGenContext,
@@ -1284,7 +1307,7 @@ ScalarizedVal createSimpleGLSLGlobalVarying(
// Validate the system value, convert to a regular parameter if this is not a valid system
// value for a given target.
if (systemSemantic && systemValueInfo && isSPIRV(codeGenContext->getTargetFormat()) &&
- systemValueInfo->targetVarName == IRTargetBuiltinVarName::HlslInstanceID &&
+ targetBuiltinRequiresLegalization(systemValueInfo->targetVarName) &&
((stage == Stage::Fragment) ||
(stage == Stage::Vertex &&
inVarLayout->usesResourceKind(LayoutResourceKind::VaryingOutput))))
@@ -3918,12 +3941,13 @@ ScalarizedVal legalizeEntryPointReturnValueForGLSL(
return result;
}
+
void legalizeTargetBuiltinVar(GLSLLegalizationContext& context)
{
List<KeyValuePair<IRTargetBuiltinVarName, IRInst*>> workItems;
for (auto [builtinVarName, varInst] : context.builtinVarMap)
{
- if (builtinVarName == IRTargetBuiltinVarName::HlslInstanceID)
+ if (targetBuiltinRequiresLegalization(builtinVarName))
{
workItems.add(KeyValuePair(builtinVarName, varInst));
}
@@ -3970,6 +3994,32 @@ void legalizeTargetBuiltinVar(GLSLLegalizationContext& context)
}
});
}
+ // Repalce SV_VertexID with gl_VertexIndex - gl_BaseVertex.
+ else if (builtinVarName == IRTargetBuiltinVarName::HlslVertexID)
+ {
+ auto vertexIndex = getOrCreateBuiltinVar(
+ IRTargetBuiltinVarName::SpvVertexIndex,
+ varInst->getDataType());
+ auto baseVertex = getOrCreateBuiltinVar(
+ IRTargetBuiltinVarName::SpvBaseVertex,
+ varInst->getDataType());
+ traverseUses(
+ varInst,
+ [&](IRUse* use)
+ {
+ auto user = use->getUser();
+ if (user->getOp() == kIROp_Load)
+ {
+ IRBuilder builder(use->getUser());
+ builder.setInsertBefore(use->getUser());
+ auto sub = builder.emitSub(
+ tryGetPointedToType(&builder, varInst->getDataType()),
+ builder.emitLoad(vertexIndex),
+ builder.emitLoad(baseVertex));
+ user->replaceUsesWith(sub);
+ }
+ });
+ }
}
}
diff --git a/source/slang/slang-ir-insts.h b/source/slang/slang-ir-insts.h
index c188b1eff..2ab4db980 100644
--- a/source/slang/slang-ir-insts.h
+++ b/source/slang/slang-ir-insts.h
@@ -203,8 +203,11 @@ enum class IRTargetBuiltinVarName
{
Unknown,
HlslInstanceID,
+ HlslVertexID,
SpvInstanceIndex,
SpvBaseInstance,
+ SpvVertexIndex,
+ SpvBaseVertex,
};
struct IRInterpolationModeDecoration : IRDecoration
diff --git a/source/slang/slang-ir-legalize-varying-params.cpp b/source/slang/slang-ir-legalize-varying-params.cpp
index 180d8eaa7..f8a9839d2 100644
--- a/source/slang/slang-ir-legalize-varying-params.cpp
+++ b/source/slang/slang-ir-legalize-varying-params.cpp
@@ -3189,6 +3189,7 @@ protected:
break;
}
case SystemValueSemanticName::InstanceID:
+ case SystemValueSemanticName::VulkanInstanceID:
{
result.systemValueName = toSlice("instance_id");
result.permittedTypes.add(builder.getBasicType(BaseType::UInt));
@@ -3252,6 +3253,7 @@ protected:
break;
}
case SystemValueSemanticName::VertexID:
+ case SystemValueSemanticName::VulkanVertexID:
{
result.systemValueName = toSlice("vertex_id");
result.permittedTypes.add(builder.getBasicType(BaseType::UInt));
@@ -3855,6 +3857,7 @@ protected:
break;
case SystemValueSemanticName::InstanceID:
+ case SystemValueSemanticName::VulkanInstanceID:
{
result.systemValueName = toSlice("instance_index");
result.permittedTypes.add(builder.getUIntType());
@@ -3908,6 +3911,7 @@ protected:
}
case SystemValueSemanticName::VertexID:
+ case SystemValueSemanticName::VulkanVertexID:
{
result.systemValueName = toSlice("vertex_index");
result.permittedTypes.add(builder.getUIntType());
diff --git a/source/slang/slang-ir-legalize-varying-params.h b/source/slang/slang-ir-legalize-varying-params.h
index 21674cd9e..233acaf94 100644
--- a/source/slang/slang-ir-legalize-varying-params.h
+++ b/source/slang/slang-ir-legalize-varying-params.h
@@ -72,6 +72,8 @@ void depointerizeInputParams(IRFunc* entryPoint);
M(WaveLaneCount, SV_WaveLaneCount) \
M(WaveLaneIndex, SV_WaveLaneIndex) \
M(QuadLaneIndex, SV_QuadLaneIndex) \
+ M(VulkanVertexID, SV_VulkanVertexID) \
+ M(VulkanInstanceID, SV_VulkanInstanceID) \
/* end */
/// A known system-value semantic name that can be applied to a parameter
diff --git a/source/slang/slang-ir-spirv-legalize.cpp b/source/slang/slang-ir-spirv-legalize.cpp
index 87a6cc4b9..20b7f795f 100644
--- a/source/slang/slang-ir-spirv-legalize.cpp
+++ b/source/slang/slang-ir-spirv-legalize.cpp
@@ -636,6 +636,8 @@ struct SPIRVLegalizationContext : public SourceEmitterBase
{
case IRTargetBuiltinVarName::SpvInstanceIndex:
case IRTargetBuiltinVarName::SpvBaseInstance:
+ case IRTargetBuiltinVarName::SpvVertexIndex:
+ case IRTargetBuiltinVarName::SpvBaseVertex:
return AddressSpace::BuiltinInput;
}
}