Fix crash when constant buffer is unused by shader but still exists

This commit is contained in:
Wojtek Figat
2025-06-27 19:06:25 +02:00
parent 185151b025
commit 3dc7546dd4
21 changed files with 24 additions and 151 deletions

View File

@@ -91,17 +91,9 @@ bool AmbientOcclusionPass::setupResources()
{
// Check shader
if (!_shader->IsLoaded())
{
return true;
}
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(ASSAOConstants))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, ASSAOConstants);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, ASSAOConstants);
// Create pipeline states
GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;

View File

@@ -36,11 +36,7 @@ bool FXAA::setupResources()
return true;
}
const auto shader = _shader->GetShader();
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
GPUPipelineState::Description psDesc;
if (!_psFXAA.IsValid())

View File

@@ -45,13 +45,7 @@ bool SMAA::setupResources()
return true;
}
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline state
GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;

View File

@@ -37,11 +37,7 @@ bool TAA::setupResources()
if (!_shader->IsLoaded())
return true;
const auto shader = _shader->GetShader();
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
if (!_psTAA)
_psTAA = GPUDevice::Instance->CreatePipelineState();
GPUPipelineState::Description psDesc;

View File

@@ -166,11 +166,7 @@ bool init()
}
auto shader = _shader->GetShader();
ASSERT(shader->GetCB(0) != nullptr);
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline stages
_psTransmittance = GPUDevice::Instance->CreatePipelineState();

View File

@@ -89,13 +89,7 @@ bool ColorGradingPass::setupResources()
if (!_shader || !_shader->IsLoaded())
return true;
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline stages
GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;

View File

@@ -48,13 +48,7 @@ bool ContrastAdaptiveSharpeningPass::setupResources()
if (!_shader || !_shader->IsLoaded())
return true;
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline stage
auto psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;

View File

@@ -117,13 +117,7 @@ bool DepthOfFieldPass::setupResources()
if (!_shader->IsLoaded())
return true;
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline stages
GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;

View File

@@ -258,13 +258,7 @@ bool EyeAdaptationPass::setupResources()
if (!_shader->IsLoaded())
return true;
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(EyeAdaptationData))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, EyeAdaptationData);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, EyeAdaptationData);
// Create pipeline stages
GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;

View File

@@ -113,13 +113,7 @@ bool HistogramPass::setupResources()
if (!_shader->IsLoaded())
return true;
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(HistogramData))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, HistogramData);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, HistogramData);
_csClearHistogram = shader->GetCS("CS_ClearHistogram");
_csGenerateHistogram = shader->GetCS("CS_GenerateHistogram");

View File

@@ -65,18 +65,8 @@ bool LightPass::setupResources()
if (!_sphereModel->CanBeRendered() || !_shader->IsLoaded())
return true;
auto shader = _shader->GetShader();
// Validate shader constant buffers sizes
if (shader->GetCB(0)->GetSize() != sizeof(PerLight))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, PerLight);
return true;
}
if (shader->GetCB(1)->GetSize() != sizeof(PerFrame))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 1, PerFrame);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, PerLight);
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 1, PerFrame);
// Create pipeline stages
GPUPipelineState::Description psDesc;

View File

@@ -80,17 +80,9 @@ bool MotionBlurPass::setupResources()
{
// Check shader
if (!_shader->IsLoaded())
{
return true;
}
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline state
GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;

View File

@@ -98,18 +98,8 @@ bool PostProcessingPass::setupResources()
if (!_shader->IsLoaded())
return true;
auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
if (shader->GetCB(1)->GetSize() != sizeof(GaussianBlurData))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 1, GaussianBlurData);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 1, GaussianBlurData);
// Create pipeline stages
GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;

View File

@@ -231,11 +231,7 @@ bool ProbesRenderer::Init()
if (!_shader->IsLoaded())
return false;
const auto shader = _shader->GetShader();
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline stages
_psFilterFace = GPUDevice::Instance->CreatePipelineState();

View File

@@ -281,13 +281,7 @@ bool ReflectionsPass::setupResources()
if (!_sphereModel->CanBeRendered() || !_preIntegratedGF->IsLoaded() || !_shader->IsLoaded())
return true;
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline stages
GPUPipelineState::Description psDesc;

View File

@@ -113,3 +113,4 @@ class RendererPass : public Singleton<T>, public RendererPassBase
};
#define REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, index, dataType) LOG(Fatal, "Shader {0} has incorrect constant buffer {1} size: {2} bytes. Expected: {3} bytes", shader->ToString(), index, shader->GetCB(index)->GetSize(), sizeof(dataType));
#define CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, index, dataType) if (shader->GetCB(index)->GetSize() != sizeof(dataType) && shader->GetCB(index)->GetSize() != 0) { REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, index, dataType); return true; }

View File

@@ -89,13 +89,7 @@ bool ScreenSpaceReflectionsPass::setupResources()
if (!_shader->IsLoaded())
return true;
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline stages
GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;

View File

@@ -507,13 +507,7 @@ bool ShadowsPass::setupResources()
if (!_sphereModel->CanBeRendered() || !_shader->IsLoaded())
return true;
auto shader = _shader->GetShader();
// Validate shader constant buffers sizes
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline stages
GPUPipelineState::Description psDesc;

View File

@@ -59,14 +59,8 @@ bool BitonicSort::setupResources()
if (!_shader->IsLoaded())
return true;
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
_cb = shader->GetCB(0);
if (_cb->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Cache compute shaders
_indirectArgsCS = shader->GetCS("CS_IndirectArgs");

View File

@@ -41,13 +41,7 @@ bool MultiScaler::setupResources()
if (!_shader->IsLoaded())
return true;
const auto shader = _shader->GetShader();
// Validate shader constant buffer size
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// Create pipeline states
GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;

View File

@@ -53,19 +53,9 @@ bool VolumetricFogPass::setupResources()
if (!_shader->IsLoaded())
return true;
auto shader = _shader->GetShader();
// Validate shader constant buffers sizes
if (shader->GetCB(0)->GetSize() != sizeof(Data))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
// CB1 is used for per-draw info (ObjectIndex)
if (shader->GetCB(2)->GetSize() != sizeof(PerLight))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 2, PerLight);
return true;
}
CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, 2, PerLight);
// Cache compute shaders
_csInitialize = shader->GetCS("CS_Initialize");