NLDClient-yudde/ProjectNLD/Assets/Code/Shaders/builtin_shaders-2022.3.17f1/CGIncludes/UnityIndirect.cginc

92 lines
4.4 KiB
HLSL

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
#ifndef UNITY_INDIRECT_INCLUDED
#define UNITY_INDIRECT_INCLUDED
// Command ID
uint unity_BaseCommandID;
uint GetCommandID(uint svDrawID) { return unity_BaseCommandID + svDrawID; }
#define unity_BaseCommandID Use_GetCommandID_function_instead_of_unity_BaseCommandID
// Non-indexed indirect draw
struct IndirectDrawArgs
{
uint vertexCountPerInstance;
uint instanceCount;
uint startVertex;
uint startInstance;
};
void GetIndirectDrawArgs(out IndirectDrawArgs args, ByteAddressBuffer argsBuffer, uint commandId)
{
uint offset = commandId * 16;
args.vertexCountPerInstance = argsBuffer.Load(offset + 0);
args.instanceCount = argsBuffer.Load(offset + 4);
args.startVertex = argsBuffer.Load(offset + 8);
args.startInstance = argsBuffer.Load(offset + 12);
}
uint GetIndirectInstanceCount(IndirectDrawArgs args) { return args.instanceCount; }
uint GetIndirectVertexCount(IndirectDrawArgs args) { return args.vertexCountPerInstance; }
#if defined(SHADER_API_VULKAN)
uint GetIndirectInstanceID(IndirectDrawArgs args, uint svInstanceID) { return svInstanceID - args.startInstance; }
uint GetIndirectInstanceID_Base(IndirectDrawArgs args, uint svInstanceID) { return svInstanceID; }
#else
uint GetIndirectInstanceID(IndirectDrawArgs args, uint svInstanceID) { return svInstanceID; }
uint GetIndirectInstanceID_Base(IndirectDrawArgs args, uint svInstanceID) { return svInstanceID + args.startInstance; }
#endif
#if defined(SHADER_API_GLCORE) || defined(SHADER_API_VULKAN)
uint GetIndirectVertexID(IndirectDrawArgs args, uint svVertexID) { return svVertexID - args.startVertex; }
uint GetIndirectVertexID_Base(IndirectDrawArgs args, uint svVertexID) { return svVertexID; }
#else
uint GetIndirectVertexID(IndirectDrawArgs args, uint svVertexID) { return svVertexID; }
uint GetIndirectVertexID_Base(IndirectDrawArgs args, uint svVertexID) { return svVertexID + args.startVertex; }
#endif
// Indexed indirect draw
struct IndirectDrawIndexedArgs
{
uint indexCountPerInstance;
uint instanceCount;
uint startIndex;
uint baseVertexIndex;
uint startInstance;
};
void GetIndirectDrawArgs(out IndirectDrawIndexedArgs args, ByteAddressBuffer argsBuffer, uint commandId)
{
uint offset = commandId * 20;
args.indexCountPerInstance = argsBuffer.Load(offset + 0);
args.instanceCount = argsBuffer.Load(offset + 4);
args.startIndex = argsBuffer.Load(offset + 8);
args.baseVertexIndex = argsBuffer.Load(offset + 12);
args.startInstance = argsBuffer.Load(offset + 16);
}
uint GetIndirectInstanceCount(IndirectDrawIndexedArgs args) { return args.instanceCount; }
uint GetIndirectVertexCount(IndirectDrawIndexedArgs args) { return args.indexCountPerInstance; }
#if defined(SHADER_API_VULKAN)
uint GetIndirectInstanceID(IndirectDrawIndexedArgs args, uint svInstanceID) { return svInstanceID - args.startInstance; }
uint GetIndirectInstanceID_Base(IndirectDrawIndexedArgs args, uint svInstanceID) { return svInstanceID; }
#else
uint GetIndirectInstanceID(IndirectDrawIndexedArgs args, uint svInstanceID) { return svInstanceID; }
uint GetIndirectInstanceID_Base(IndirectDrawIndexedArgs args, uint svInstanceID) { return svInstanceID + args.startInstance; }
#endif
uint GetIndirectVertexID(IndirectDrawIndexedArgs args, uint svVertexID) { return svVertexID; }
uint GetIndirectVertexID_Base(IndirectDrawIndexedArgs args, uint svVertexID) { return svVertexID + args.startIndex; }
// Indirect draw ID accessors
#ifdef UNITY_INDIRECT_DRAW_ARGS
ByteAddressBuffer unity_IndirectDrawArgs;
static UNITY_INDIRECT_DRAW_ARGS globalIndirectDrawArgs;
void InitIndirectDrawArgs(uint svDrawID) { GetIndirectDrawArgs(globalIndirectDrawArgs, unity_IndirectDrawArgs, GetCommandID(svDrawID)); }
uint GetIndirectInstanceCount() { return GetIndirectInstanceCount(globalIndirectDrawArgs); }
uint GetIndirectVertexCount() { return GetIndirectVertexCount(globalIndirectDrawArgs); }
uint GetIndirectInstanceID(uint svInstanceID) { return GetIndirectInstanceID(globalIndirectDrawArgs, svInstanceID); }
uint GetIndirectInstanceID_Base(uint svInstanceID) { return GetIndirectInstanceID_Base(globalIndirectDrawArgs, svInstanceID); }
uint GetIndirectVertexID(uint svVertexID) { return GetIndirectVertexID(globalIndirectDrawArgs, svVertexID); }
uint GetIndirectVertexID_Base(uint svVertexID) { return GetIndirectVertexID_Base(globalIndirectDrawArgs, svVertexID); }
#endif
#endif // UNITY_INDIRECT_INCLUDED