* Remove fog and lighting uniforms from FL0 --------- Co-authored-by: Mathias Agopian <mathias@google.com>
298 lines
16 KiB
C++
298 lines
16 KiB
C++
/*
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "UibGenerator.h"
|
|
#include "private/filament/UibStructs.h"
|
|
|
|
#include "private/filament/BufferInterfaceBlock.h"
|
|
|
|
#include <private/filament/EngineEnums.h>
|
|
#include <backend/DriverEnums.h>
|
|
|
|
#include <utils/debug.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
namespace filament {
|
|
|
|
using namespace backend;
|
|
|
|
BufferInterfaceBlock const& UibGenerator::get(UibGenerator::Ubo ubo) noexcept {
|
|
assert_invariant(ubo != Ubo::MaterialParams);
|
|
switch (ubo) {
|
|
case Ubo::FrameUniforms:
|
|
return getPerViewUib();
|
|
case Ubo::ObjectUniforms:
|
|
return getPerRenderableUib();
|
|
case Ubo::BonesUniforms:
|
|
return getPerRenderableBonesUib();
|
|
case Ubo::MorphingUniforms:
|
|
return getPerRenderableMorphingUib();
|
|
case Ubo::LightsUniforms:
|
|
return getLightsUib();
|
|
case Ubo::ShadowUniforms:
|
|
return getShadowUib();
|
|
case Ubo::FroxelRecordUniforms:
|
|
return getFroxelRecordUib();
|
|
case Ubo::FroxelsUniforms:
|
|
return getFroxelsUib();
|
|
case Ubo::MaterialParams:
|
|
abort();
|
|
}
|
|
}
|
|
|
|
UibGenerator::Binding UibGenerator::getBinding(UibGenerator::Ubo ubo) noexcept {
|
|
switch (ubo) {
|
|
case Ubo::FrameUniforms:
|
|
return { +DescriptorSetBindingPoints::PER_VIEW,
|
|
+PerViewBindingPoints::FRAME_UNIFORMS };
|
|
case Ubo::ObjectUniforms:
|
|
return { +DescriptorSetBindingPoints::PER_RENDERABLE,
|
|
+PerRenderableBindingPoints::OBJECT_UNIFORMS };
|
|
case Ubo::BonesUniforms:
|
|
return { +DescriptorSetBindingPoints::PER_RENDERABLE,
|
|
+PerRenderableBindingPoints::BONES_UNIFORMS };
|
|
case Ubo::MorphingUniforms:
|
|
return { +DescriptorSetBindingPoints::PER_RENDERABLE,
|
|
+PerRenderableBindingPoints::MORPHING_UNIFORMS };
|
|
case Ubo::LightsUniforms:
|
|
return { +DescriptorSetBindingPoints::PER_VIEW,
|
|
+PerViewBindingPoints::LIGHTS };
|
|
case Ubo::ShadowUniforms:
|
|
return { +DescriptorSetBindingPoints::PER_VIEW,
|
|
+PerViewBindingPoints::SHADOWS };
|
|
case Ubo::FroxelRecordUniforms:
|
|
return { +DescriptorSetBindingPoints::PER_VIEW,
|
|
+PerViewBindingPoints::RECORD_BUFFER };
|
|
case Ubo::FroxelsUniforms:
|
|
return { +DescriptorSetBindingPoints::PER_VIEW,
|
|
+PerViewBindingPoints::FROXEL_BUFFER };
|
|
case Ubo::MaterialParams:
|
|
return { +DescriptorSetBindingPoints::PER_MATERIAL,
|
|
+PerMaterialBindingPoints::MATERIAL_PARAMS };
|
|
}
|
|
}
|
|
|
|
static_assert(CONFIG_MAX_SHADOW_CASCADES == 4,
|
|
"Changing CONFIG_MAX_SHADOW_CASCADES affects PerView size and breaks materials.");
|
|
|
|
BufferInterfaceBlock const& UibGenerator::getPerViewUib() noexcept {
|
|
using Type = BufferInterfaceBlock::Type;
|
|
|
|
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
|
|
.name(PerViewUib::_name)
|
|
.add({
|
|
{ "viewFromWorldMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "worldFromViewMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "clipFromViewMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "viewFromClipMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "eyeFromViewMatrix", CONFIG_MAX_STEREOSCOPIC_EYES,
|
|
Type::MAT4, Precision::HIGH },
|
|
{ "clipFromWorldMatrix", CONFIG_MAX_STEREOSCOPIC_EYES,
|
|
Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "worldFromClipMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "userWorldFromWorldMatrix",0,Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "clipTransform", 0, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
|
|
{ "clipControl", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "time", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "temporalNoise", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "userTime", 0, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// values below should only be accessed in surface materials
|
|
// ------------------------------------------------------------------------------------
|
|
|
|
{ "resolution", 0, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "logicalViewportScale", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "logicalViewportOffset", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
|
|
{ "lodBias", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "refractionLodOffset", 0, Type::FLOAT, Precision::DEFAULT },
|
|
{ "derivativesScale", 0, Type::FLOAT2 },
|
|
|
|
{ "oneOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "nearOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "cameraFar", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "exposure", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, // high precision to work around #3602 (qualcom),
|
|
{ "ev100", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "needsAlphaChannel", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
|
|
|
|
// AO
|
|
{ "aoSamplingQualityAndEdgeDistance", 0, Type::FLOAT },
|
|
{ "aoBentNormals", 0, Type::FLOAT },
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// Dynamic Lighting [variant: DYN]
|
|
// ------------------------------------------------------------------------------------
|
|
{ "zParams", 0, Type::FLOAT4 },
|
|
{ "fParams", 0, Type::UINT3 },
|
|
{ "lightChannels", 0, Type::INT },
|
|
{ "froxelCountXY", 0, Type::FLOAT2 },
|
|
{ "enableFroxelViz", 0, Type::INT },
|
|
{ "dynReserved0", 0, Type::INT },
|
|
{ "dynReserved1", 0, Type::INT },
|
|
{ "dynReserved2", 0, Type::INT },
|
|
|
|
{ "iblLuminance", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "iblRoughnessOneLevel", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "iblSH", 9, Type::FLOAT3 },
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// Directional Lighting [variant: DIR]
|
|
// ------------------------------------------------------------------------------------
|
|
{ "lightDirection", 0, Type::FLOAT3, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "padding0", 0, Type::FLOAT },
|
|
{ "lightColorIntensity", 0, Type::FLOAT4, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "sun", 0, Type::FLOAT4, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "shadowFarAttenuationParams", 0, Type::FLOAT2, Precision::HIGH },
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// Directional light shadowing [variant: SRE | DIR]
|
|
// ------------------------------------------------------------------------------------
|
|
{ "directionalShadows", 0, Type::INT },
|
|
{ "ssContactShadowDistance", 0, Type::FLOAT },
|
|
|
|
{ "cascadeSplits", 0, Type::FLOAT4, Precision::HIGH },
|
|
{ "cascades", 0, Type::INT },
|
|
{ "shadowPenumbraRatioScale", 0, Type::FLOAT },
|
|
{ "lightFarAttenuationParams", 0, Type::FLOAT2, Precision::HIGH },
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// VSM shadows [variant: VSM]
|
|
// ------------------------------------------------------------------------------------
|
|
{ "vsmExponent", 0, Type::FLOAT },
|
|
{ "vsmDepthScale", 0, Type::FLOAT },
|
|
{ "vsmLightBleedReduction", 0, Type::FLOAT },
|
|
{ "shadowSamplingType", 0, Type::UINT },
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// Fog [variant: FOG]
|
|
// ------------------------------------------------------------------------------------
|
|
{ "fogDensity", 0, Type::FLOAT3,Precision::HIGH },
|
|
{ "fogStart", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "fogMaxOpacity", 0, Type::FLOAT, Precision::DEFAULT },
|
|
{ "fogMinMaxMip", 0, Type::UINT, Precision::HIGH },
|
|
{ "fogHeightFalloff", 0, Type::FLOAT, Precision::HIGH },
|
|
{ "fogCutOffDistance", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "fogColor", 0, Type::FLOAT3, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "fogColorFromIbl", 0, Type::FLOAT, Precision::DEFAULT },
|
|
{ "fogInscatteringStart", 0, Type::FLOAT, Precision::HIGH },
|
|
{ "fogInscatteringSize", 0, Type::FLOAT, Precision::DEFAULT },
|
|
{ "fogOneOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH },
|
|
{ "fogNearOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH },
|
|
{ "fogFromWorldMatrix", 0, Type::MAT3, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "fogLinearParams", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "fogReserved0", 0, Type::FLOAT2, Precision::HIGH },
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// Screen-space reflections [variant: SSR (i.e.: VSM | SRE)]
|
|
// ------------------------------------------------------------------------------------
|
|
{ "ssrReprojection", 0, Type::MAT4, Precision::HIGH },
|
|
{ "ssrUvFromViewMatrix", 0, Type::MAT4, Precision::HIGH },
|
|
{ "ssrThickness", 0, Type::FLOAT },
|
|
{ "ssrBias", 0, Type::FLOAT },
|
|
{ "ssrDistance", 0, Type::FLOAT },
|
|
{ "ssrStride", 0, Type::FLOAT },
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
// user defined global variables
|
|
// --------------------------------------------------------------------------------------------
|
|
{ "custom", 4, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
// for feature level 0 / es2 usage
|
|
// --------------------------------------------------------------------------------------------
|
|
{ "rec709", 0, Type::INT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
|
|
{ "es2Reserved0", 0, Type::FLOAT },
|
|
{ "es2Reserved1", 0, Type::FLOAT },
|
|
{ "es2Reserved2", 0, Type::FLOAT },
|
|
|
|
// bring PerViewUib to 2 KiB
|
|
{ "reserved", sizeof(PerViewUib::reserved)/16, Type::FLOAT4 }
|
|
})
|
|
.build();
|
|
|
|
return uib;
|
|
}
|
|
|
|
BufferInterfaceBlock const& UibGenerator::getPerRenderableUib() noexcept {
|
|
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
|
|
.name(PerRenderableUib::_name)
|
|
.add({{ "data", CONFIG_MAX_INSTANCES, BufferInterfaceBlock::Type::STRUCT, {}, {},
|
|
"PerRenderableData", sizeof(PerRenderableData), "CONFIG_MAX_INSTANCES" }})
|
|
.build();
|
|
return uib;
|
|
}
|
|
|
|
BufferInterfaceBlock const& UibGenerator::getLightsUib() noexcept {
|
|
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
|
|
.name(LightsUib::_name)
|
|
.add({{ "lights", CONFIG_MAX_LIGHT_COUNT,
|
|
BufferInterfaceBlock::Type::MAT4, Precision::HIGH }})
|
|
.build();
|
|
return uib;
|
|
}
|
|
|
|
BufferInterfaceBlock const& UibGenerator::getShadowUib() noexcept {
|
|
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
|
|
.name(ShadowUib::_name)
|
|
.add({{ "shadows", CONFIG_MAX_SHADOWMAPS,
|
|
BufferInterfaceBlock::Type::STRUCT, {}, {},
|
|
"ShadowData", sizeof(ShadowUib::ShadowData) }})
|
|
.build();
|
|
return uib;
|
|
}
|
|
|
|
BufferInterfaceBlock const& UibGenerator::getPerRenderableBonesUib() noexcept {
|
|
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
|
|
.name(PerRenderableBoneUib::_name)
|
|
.add({{ "bones", CONFIG_MAX_BONE_COUNT,
|
|
BufferInterfaceBlock::Type::STRUCT, {}, {},
|
|
"BoneData", sizeof(PerRenderableBoneUib::BoneData) }})
|
|
.build();
|
|
return uib;
|
|
}
|
|
|
|
BufferInterfaceBlock const& UibGenerator::getPerRenderableMorphingUib() noexcept {
|
|
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
|
|
.name(PerRenderableMorphingUib::_name)
|
|
.add({{ "weights", CONFIG_MAX_MORPH_TARGET_COUNT,
|
|
BufferInterfaceBlock::Type::FLOAT4 }})
|
|
.build();
|
|
return uib;
|
|
}
|
|
|
|
BufferInterfaceBlock const& UibGenerator::getFroxelRecordUib() noexcept {
|
|
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
|
|
.name(FroxelRecordUib::_name)
|
|
.add({{ "records", 1024, BufferInterfaceBlock::Type::UINT4, Precision::HIGH, {},
|
|
{}, {}, "CONFIG_FROXEL_RECORD_BUFFER_HEIGHT"}})
|
|
.build();
|
|
return uib;
|
|
}
|
|
|
|
BufferInterfaceBlock const& UibGenerator::getFroxelsUib() noexcept {
|
|
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
|
|
.name(FroxelsUib::_name)
|
|
.add({{ "records", 1024, BufferInterfaceBlock::Type::UINT4, Precision::HIGH, {},
|
|
{}, {}, "CONFIG_FROXEL_BUFFER_HEIGHT"}})
|
|
.build();
|
|
return uib;
|
|
}
|
|
|
|
} // namespace filament
|