a bit of stuff, time to add spirv-link into this project

This commit is contained in:
2026-02-23 01:42:17 +02:00
parent c00ecf4081
commit 003106a4d7
48 changed files with 626 additions and 752 deletions

View File

@@ -63,6 +63,9 @@ void CSlangVulkanSpirvShaderCompiler::CompileShaderStage( EShaderStage eStage, c
case SHADER_STAGE_PIXEL:
eSlangStage = SLANG_STAGE_PIXEL;
break;
case SHADER_STAGE_CALLABLE:
eSlangStage = SLANG_STAGE_CALLABLE;
break;
default:
break;
}
@@ -70,6 +73,8 @@ void CSlangVulkanSpirvShaderCompiler::CompileShaderStage( EShaderStage eStage, c
pProgramLayout = pModule->getLayout();
uint32_t uCount = pProgramLayout->getParameterCount();
// we want to get all inputs
// just for the sake of making vulkan simple
CUtlVector<VulkanDescriptor_t> inputs;
VulkanDescriptor_t input = {};
for ( uint32_t u = 0; u < uCount; u++ )
@@ -86,7 +91,6 @@ trygetkind:
case slang::TypeReflection::Kind::ConstantBuffer:
input.eDescriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
break;
case slang::TypeReflection::Kind::Resource:
V_printf("%s: %i\n", pType->getName(), pType->getResourceShape());
switch(pType->getResourceShape())
{
@@ -122,16 +126,34 @@ trygetkind:
V_printf("%i\n", input.uCount);
inputs.AppendTail(input);
}
pModule->findAndCheckEntryPoint(szMain, eSlangStage, &pEntryPoint, &m_pDiagnostics);
// stage was not defined
if (pEntryPoint == NULL)
{
// fool it
m_pDiagnostics = NULL;
return;
}
CheckDiagnostics();
pEntryPoint->link(&pLinked, &m_pDiagnostics);
CheckDiagnostics();
if (pLinked == NULL)
{
pEntryPoint->release();
return;
}
pLinked->getEntryPointCode(0, 0, &pBinary, &m_pDiagnostics);
CheckDiagnostics();
if (pBinary == NULL)
{
pEntryPoint->release();
return;
}
pShaderObject = pShader->AllocateShader();
pShaderObject->m_eBackend = SHADER_BACKEND_SPIRV_VULKAN;
@@ -145,6 +167,13 @@ trygetkind:
pShaderObject->m_nMetadataLump = pShader->AllocateLump(sizeof(VulkanInputMetaData_t));
V_memcpy(pShader->GetLumpPtr(pShaderObject->m_nDataLump), pBinary->getBufferPointer(), pBinary->getBufferSize());
V_memcpy(pShader->GetLumpPtr(pShaderObject->m_nMetadataLump), &stMetadata, sizeof(VulkanInputMetaData_t));
if (eStage == SHADER_STAGE_CALLABLE)
{
IFileHandle *ph = filesystem->Open("a.txt", FILEMODE_WRITE);
filesystem->Write(ph, pBinary->getBufferPointer(), pBinary->getBufferSize());
filesystem->Close(ph);
}
pEntryPoint->release();
}
@@ -196,6 +225,10 @@ void CSlangVulkanSpirvShaderCompiler::CompileShader( const char *szInput, CCompi
szMainName = "psMain";
stStageMacroDesc = { "PS_SHADER", "Enabled" };
break;
case SHADER_STAGE_CALLABLE:
szMainName = "brdfMain";
stStageMacroDesc = { "BRDF_SHADER", "Enabled" };
break;
default:
break;
}
@@ -212,7 +245,8 @@ void CSlangVulkanSpirvShaderCompiler::CompileShader( const char *szInput, CCompi
CompileShaderStage((EShaderStage)i, szMainName, pSession, pModule, pShader);
pModule->release();
pSession->release();
// ah yes free(): corrupted unsorted chunks
//pSession->release();
}
V_free((void*)szShaderSource);
@@ -224,6 +258,7 @@ void CSlangVulkanSpirvShaderCompiler::CheckDiagnostics()
{
V_printf("%s\n",(const char*)m_pDiagnostics->getBufferPointer());
}
m_pDiagnostics = NULL;
};
void CSlangVulkanSpirvShaderCompiler::Init()