Fix crash when constant buffer is unused by shader but still exists
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user