diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/glsl.meta.slang | 31 | ||||
| -rw-r--r-- | source/slang/slang-emit-c-like.cpp | 4 | ||||
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 9 | ||||
| -rw-r--r-- | source/slang/slang-ir-glsl-legalize.cpp | 54 | ||||
| -rw-r--r-- | source/slang/slang-ir-insts.h | 3 | ||||
| -rw-r--r-- | source/slang/slang-ir-legalize-varying-params.cpp | 4 | ||||
| -rw-r--r-- | source/slang/slang-ir-legalize-varying-params.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-ir-spirv-legalize.cpp | 2 |
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; } } |
