Normalize builtin forward shader bindings
This commit is contained in:
@@ -52,6 +52,11 @@ private:
|
||||
|
||||
namespace {
|
||||
|
||||
bool IsDepthFormat(RHI::Format format) {
|
||||
return format == RHI::Format::D24_UNorm_S8_UInt ||
|
||||
format == RHI::Format::D32_Float;
|
||||
}
|
||||
|
||||
bool TryResolveSurfacePassType(
|
||||
const Resources::Material* material,
|
||||
BuiltinMaterialPass& outPass) {
|
||||
@@ -283,7 +288,8 @@ bool BuiltinForwardPipeline::ExecuteForwardOpaquePass(const RenderPassContext& p
|
||||
|
||||
commandList->SetPrimitiveTopology(RHI::PrimitiveTopology::TriangleList);
|
||||
|
||||
if (sceneData.lighting.HasMainDirectionalShadow()) {
|
||||
if (sceneData.lighting.HasMainDirectionalShadow() &&
|
||||
IsDepthFormat(sceneData.lighting.mainDirectionalShadow.shadowMap->GetFormat())) {
|
||||
commandList->TransitionBarrier(
|
||||
sceneData.lighting.mainDirectionalShadow.shadowMap,
|
||||
RHI::ResourceStates::DepthWrite,
|
||||
@@ -310,7 +316,8 @@ bool BuiltinForwardPipeline::ExecuteForwardOpaquePass(const RenderPassContext& p
|
||||
DrawVisibleItem(context, sceneData, visibleItem);
|
||||
}
|
||||
|
||||
if (sceneData.lighting.HasMainDirectionalShadow()) {
|
||||
if (sceneData.lighting.HasMainDirectionalShadow() &&
|
||||
IsDepthFormat(sceneData.lighting.mainDirectionalShadow.shadowMap->GetFormat())) {
|
||||
commandList->TransitionBarrier(
|
||||
sceneData.lighting.mainDirectionalShadow.shadowMap,
|
||||
RHI::ResourceStates::PixelShaderResource,
|
||||
@@ -530,9 +537,9 @@ BuiltinForwardPipeline::PassResourceLayout* BuiltinForwardPipeline::GetOrCreateP
|
||||
return nullptr;
|
||||
};
|
||||
|
||||
Containers::Array<Resources::ShaderResourceBindingDesc> resourceBindings = resolvedShaderPass.pass->resources;
|
||||
const Containers::Array<Resources::ShaderResourceBindingDesc>& resourceBindings = resolvedShaderPass.pass->resources;
|
||||
if (resourceBindings.Empty()) {
|
||||
resourceBindings = BuildLegacyBuiltinForwardPassResourceBindings();
|
||||
return failLayout("BuiltinForwardPipeline requires explicit resource bindings on the resolved shader pass");
|
||||
}
|
||||
|
||||
BuiltinPassResourceBindingPlan bindingPlan = {};
|
||||
@@ -564,38 +571,6 @@ BuiltinForwardPipeline::PassResourceLayout* BuiltinForwardPipeline::GetOrCreateP
|
||||
return failLayout("BuiltinForwardPipeline requires a PerObject resource binding");
|
||||
}
|
||||
|
||||
if (hasAnyResource &&
|
||||
passLayout.firstDescriptorSet > 0 &&
|
||||
!passLayout.setLayouts.empty() &&
|
||||
passLayout.setLayouts[0].bindings.empty()) {
|
||||
BuiltinPassSetLayoutMetadata& compatibilitySet = passLayout.setLayouts[0];
|
||||
if (bindingPlan.usesConstantBuffers) {
|
||||
compatibilitySet.bindings.push_back({
|
||||
0,
|
||||
static_cast<uint32_t>(RHI::DescriptorType::CBV),
|
||||
1,
|
||||
0
|
||||
});
|
||||
}
|
||||
if (bindingPlan.usesTextures) {
|
||||
compatibilitySet.bindings.push_back({
|
||||
0,
|
||||
static_cast<uint32_t>(RHI::DescriptorType::SRV),
|
||||
1,
|
||||
0
|
||||
});
|
||||
}
|
||||
if (bindingPlan.usesSamplers) {
|
||||
compatibilitySet.bindings.push_back({
|
||||
0,
|
||||
static_cast<uint32_t>(RHI::DescriptorType::Sampler),
|
||||
1,
|
||||
0
|
||||
});
|
||||
}
|
||||
RefreshBuiltinPassSetLayoutMetadata(compatibilitySet);
|
||||
}
|
||||
|
||||
std::vector<RHI::DescriptorSetLayoutDesc> nativeSetLayouts(passLayout.setLayouts.size());
|
||||
for (size_t i = 0; i < passLayout.setLayouts.size(); ++i) {
|
||||
nativeSetLayouts[i] = passLayout.setLayouts[i].layout;
|
||||
|
||||
Reference in New Issue
Block a user