Shader linking i guess

This commit is contained in:
2026-04-12 14:52:33 +03:00
parent 79ceac1005
commit 457b455042
38 changed files with 12534 additions and 114 deletions

View File

@@ -0,0 +1,105 @@
#include "tier2/fileformats/json.h"
#include "tier2/ifilesystem.h"
#include "tier0/commandline.h"
#include "tier0/mem.h"
#include "helper.h"
#define EXTERNAL "../../external/"
#define GRAMMAR EXTERNAL"SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json"
#define OUTPUT "rtlinker_gen.cpp"
DECLARE_BUILD_STAGE(SpirvOperandsGen)
{
if (!filesystem2->ShouldRecompile(GRAMMAR, OUTPUT))
return 0;
if (!filesystem2->ShouldRecompile(__FILE__, OUTPUT))
return 0;
IFileHandle *pHandle = filesystem->Open(GRAMMAR, FILEMODE_READ);
if (pHandle == NULL)
return 0;
const char *szContents = filesystem->ReadString(pHandle);
filesystem->Close(pHandle);
pHandle = filesystem->Open(OUTPUT, FILEMODE_WRITE);
IJSONValue *pRoot = JSONManager()->ReadString(szContents);
IJSONArray *instructions = pRoot->GetObject()->GetValue("instructions")->GetArray();
filesystem->PrintF( pHandle, "#include \"rtlinker_gen.h\"\n");
filesystem->PrintF( pHandle, "int SpvGetOperandCount( int op )\n{\nswitch ( op ) {\n");
for ( int i = 0; i < instructions->GetCount(); i++)
{
IJSONObject *op = instructions->GetParameter(i)->GetObject();
if (op->GetValue("operands"))
filesystem->PrintF( pHandle, "case %.0f: return %u;\n", op->GetValue("opcode")->GetNumberValue(), op->GetValue("operands")->GetArray()->GetCount());
}
filesystem->PrintF( pHandle, "default: break;\n}\nreturn 0;\n}\n");
filesystem->PrintF( pHandle, "void SpvGetOperands( int op, ESpirvOperandType *pTypes )\n{\nswitch ( op ) {\n");
for ( int i = 0; i < instructions->GetCount(); i++)
{
IJSONObject *op = instructions->GetParameter(i)->GetObject();
if (op->GetValue("operands"))
{
IJSONArray *operands = op->GetValue("operands")->GetArray();
filesystem->PrintF( pHandle, "case %.0f:\n", op->GetValue("opcode")->GetNumberValue());
for ( int o = 0; o < operands->GetCount(); o++ )
{
CUtlString type = operands->GetParameter(o)->GetObject()->GetValue("kind")->GetStringValue();
if (type == "IdRef")
filesystem->PrintF( pHandle, "pTypes[%u] = k_ESpirv_RefId;\n",o);
else if (type == "IdResult")
filesystem->PrintF( pHandle, "pTypes[%u] = k_ESpirv_ResultId;\n",o);
else if (type == "IdResultType")
filesystem->PrintF( pHandle, "pTypes[%u] = k_ESpirv_ResultTypeId;\n",o);
else if (type == "IdScope")
filesystem->PrintF( pHandle, "pTypes[%u] = k_ESpirv_ScopeId;\n",o);
else if (type == "IdMemorySemantics")
filesystem->PrintF( pHandle, "pTypes[%u] = k_ESpirv_MemorySemanticsId;\n",o);
}
filesystem->PrintF( pHandle, "break;\n");
}
}
filesystem->PrintF( pHandle, "default: break;\n}\n");
filesystem->PrintF( pHandle, "}\n");
filesystem->PrintF( pHandle, "void SpvGetOperandFlags( int op, ESpirvOperandFlags *pTypes )\n{\nswitch ( op ) {\n");
for ( int i = 0; i < instructions->GetCount(); i++)
{
IJSONObject *op = instructions->GetParameter(i)->GetObject();
if (op->GetValue("operands"))
{
IJSONArray *operands = op->GetValue("operands")->GetArray();
filesystem->PrintF( pHandle, "case %.0f:\n", op->GetValue("opcode")->GetNumberValue());
for ( int o = 0; o < operands->GetCount(); o++ )
{
IJSONValue *q = operands->GetParameter(o)->GetObject()->GetValue("quantifier");
if (q == 0)
{
filesystem->PrintF( pHandle, "pTypes[%u] = k_ESpirvOperandFlags_None;\n",o);
continue;
}
CUtlString type = q->GetStringValue();
if (type == NULL)
filesystem->PrintF( pHandle, "pTypes[%u] = k_ESpirvOperandFlags_None;\n",o);
if (type == "?")
filesystem->PrintF( pHandle, "pTypes[%u] = k_ESpirvOperandFlags_Optional;\n",o);
else if (type == "*")
filesystem->PrintF( pHandle, "pTypes[%u] = k_ESpirvOperandFlags_Array;\n",o);
}
filesystem->PrintF( pHandle, "break;\n");
}
}
filesystem->PrintF( pHandle, "default: break;\n}\n");
filesystem->PrintF( pHandle, "}\n");
filesystem->Close( pHandle );
V_free((void*)szContents);
return 0;
}