Skip to content

Commit 7e6839f

Browse files
committed
remove dependence on per-view descset layout from filamat
I've been going back and forth on whether we information about the per-view descriptor set layout should be written in the material file. In this change, we remove that dependency. By definition the "per view" descriptor-set layout should only depend on view parameters and obviously, all materials must be compatible. In practice, a material does affect the layout so a reconciliation needs to happen somewhere. It's easier to maintain to have all this logic in one place (in Filament) instead of split between material generation and filament. All this change really does is to remove the information about the per-view layout from the material file, and move it to Material in filament, where it is hardcoded (before it was hardcoded in filamat), but because both sides needed to match there was shared code. **Material recompilation needed**
1 parent 3d78322 commit 7e6839f

File tree

8 files changed

+127
-176
lines changed

8 files changed

+127
-176
lines changed

NEW_RELEASE_NOTES.md

+2
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ for next branch cut* header.
77
appropriate header in [RELEASE_NOTES.md](./RELEASE_NOTES.md).
88

99
## Release notes for next branch cut
10+
11+
- materials: remove dependence on per-view descset layout from filamat. [⚠️ **New Material Version**]

filament/backend/include/backend/Program.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ class Program {
4444

4545
struct Descriptor {
4646
utils::CString name;
47-
backend::DescriptorType type;
48-
backend::descriptor_binding_t binding;
47+
DescriptorType type;
48+
descriptor_binding_t binding;
4949
};
5050

5151
struct SpecializationConstant {

filament/src/MaterialParser.cpp

+49-63
Original file line numberDiff line numberDiff line change
@@ -648,87 +648,73 @@ bool ChunkAttributeInfo::unflatten(Unflattener& unflattener,
648648
bool ChunkDescriptorBindingsInfo::unflatten(Unflattener& unflattener,
649649
MaterialParser::DescriptorBindingsContainer* container) {
650650

651-
uint8_t setCount;
652-
if (!unflattener.read(&setCount)) {
651+
static_assert(sizeof(DescriptorSetBindingPoints) == sizeof(uint8_t));
652+
653+
uint8_t descriptorCount;
654+
if (!unflattener.read(&descriptorCount)) {
653655
return false;
654656
}
655657

656-
for (size_t j = 0; j < setCount; j++) {
657-
static_assert(sizeof(DescriptorSetBindingPoints) == sizeof(uint8_t));
658-
659-
DescriptorSetBindingPoints set;
660-
if (!unflattener.read(reinterpret_cast<uint8_t*>(&set))) {
658+
auto& descriptors = (*container)[+DescriptorSetBindingPoints::PER_MATERIAL];
659+
descriptors.reserve(descriptorCount);
660+
for (size_t i = 0; i < descriptorCount; i++) {
661+
CString name;
662+
if (!unflattener.read(&name)) {
661663
return false;
662664
}
663-
664-
uint8_t descriptorCount;
665-
if (!unflattener.read(&descriptorCount)) {
665+
uint8_t type;
666+
if (!unflattener.read(&type)) {
666667
return false;
667668
}
668-
669-
auto& descriptors = (*container)[+set];
670-
descriptors.reserve(descriptorCount);
671-
for (size_t i = 0; i < descriptorCount; i++) {
672-
CString name;
673-
if (!unflattener.read(&name)) {
674-
return false;
675-
}
676-
uint8_t type;
677-
if (!unflattener.read(&type)) {
678-
return false;
679-
}
680-
uint8_t binding;
681-
if (!unflattener.read(&binding)) {
682-
return false;
683-
}
684-
descriptors.push_back({
685-
std::move(name),
686-
DescriptorType(type),
687-
descriptor_binding_t(binding)});
669+
uint8_t binding;
670+
if (!unflattener.read(&binding)) {
671+
return false;
688672
}
673+
descriptors.push_back({
674+
std::move(name),
675+
DescriptorType(type),
676+
descriptor_binding_t(binding)});
689677
}
690678

691679
return true;
692680
}
693681

694682
bool ChunkDescriptorSetLayoutInfo::unflatten(Unflattener& unflattener,
695683
MaterialParser::DescriptorSetLayoutContainer* container) {
696-
for (size_t j = 0; j < 2; j++) {
697-
uint8_t descriptorCount;
698-
if (!unflattener.read(&descriptorCount)) {
684+
uint8_t descriptorCount;
685+
if (!unflattener.read(&descriptorCount)) {
686+
return false;
687+
}
688+
auto& descriptors = container->bindings;
689+
descriptors.reserve(descriptorCount);
690+
for (size_t i = 0; i < descriptorCount; i++) {
691+
uint8_t type;
692+
if (!unflattener.read(&type)) {
699693
return false;
700694
}
701-
auto& descriptors = (*container)[j].bindings;
702-
descriptors.reserve(descriptorCount);
703-
for (size_t i = 0; i < descriptorCount; i++) {
704-
uint8_t type;
705-
if (!unflattener.read(&type)) {
706-
return false;
707-
}
708-
uint8_t stageFlags;
709-
if (!unflattener.read(&stageFlags)) {
710-
return false;
711-
}
712-
uint8_t binding;
713-
if (!unflattener.read(&binding)) {
714-
return false;
715-
}
716-
uint8_t flags;
717-
if (!unflattener.read(&flags)) {
718-
return false;
719-
}
720-
uint16_t count;
721-
if (!unflattener.read(&count)) {
722-
return false;
723-
}
724-
descriptors.push_back({
725-
DescriptorType(type),
726-
ShaderStageFlags(stageFlags),
727-
descriptor_binding_t(binding),
728-
DescriptorFlags(flags),
729-
count,
730-
});
695+
uint8_t stageFlags;
696+
if (!unflattener.read(&stageFlags)) {
697+
return false;
698+
}
699+
uint8_t binding;
700+
if (!unflattener.read(&binding)) {
701+
return false;
702+
}
703+
uint8_t flags;
704+
if (!unflattener.read(&flags)) {
705+
return false;
706+
}
707+
uint16_t count;
708+
if (!unflattener.read(&count)) {
709+
return false;
731710
}
711+
descriptors.push_back({
712+
DescriptorType(type),
713+
ShaderStageFlags(stageFlags),
714+
descriptor_binding_t(binding),
715+
DescriptorFlags(flags),
716+
count,
717+
});
732718
}
733719
return true;
734720
}

filament/src/MaterialParser.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class MaterialParser {
9393
using DescriptorBindingsContainer = backend::Program::DescriptorSetInfo;
9494
bool getDescriptorBindings(DescriptorBindingsContainer* container) const noexcept;
9595

96-
using DescriptorSetLayoutContainer = std::array<backend::DescriptorSetLayout, 2>;
96+
using DescriptorSetLayoutContainer = backend::DescriptorSetLayout;
9797
bool getDescriptorSetLayout(DescriptorSetLayoutContainer* container) const noexcept;
9898

9999
bool getDepthWriteSet(bool* value) const noexcept;

filament/src/details/Material.cpp

+28-6
Original file line numberDiff line numberDiff line change
@@ -609,9 +609,12 @@ Program FMaterial::getProgramWithVariants(
609609
program.attributes(mAttributeInfo);
610610
}
611611

612-
program.descriptorBindings(0, mProgramDescriptorBindings[0]);
613-
program.descriptorBindings(1, mProgramDescriptorBindings[1]);
614-
program.descriptorBindings(2, mProgramDescriptorBindings[2]);
612+
program.descriptorBindings(+DescriptorSetBindingPoints::PER_VIEW,
613+
mProgramDescriptorBindings[+DescriptorSetBindingPoints::PER_VIEW]);
614+
program.descriptorBindings(+DescriptorSetBindingPoints::PER_RENDERABLE,
615+
mProgramDescriptorBindings[+DescriptorSetBindingPoints::PER_RENDERABLE]);
616+
program.descriptorBindings(+DescriptorSetBindingPoints::PER_MATERIAL,
617+
mProgramDescriptorBindings[+DescriptorSetBindingPoints::PER_MATERIAL]);
615618
program.specializationConstants(mSpecializationConstants);
616619

617620
program.pushConstants(ShaderStage::VERTEX, mPushConstants[uint8_t(ShaderStage::VERTEX)]);
@@ -1143,17 +1146,36 @@ void FMaterial::processDescriptorSets(FEngine& engine, MaterialParser const* con
11431146
success = parser->getDescriptorBindings(&mProgramDescriptorBindings);
11441147
assert_invariant(success);
11451148

1146-
std::array<backend::DescriptorSetLayout, 2> descriptorSetLayout;
1149+
backend::DescriptorSetLayout descriptorSetLayout;
11471150
success = parser->getDescriptorSetLayout(&descriptorSetLayout);
11481151
assert_invariant(success);
11491152

1153+
// get the PER_VIEW descriptor binding info
1154+
auto const& perViewDescriptorSetLayout = descriptor_sets::getPerViewDescriptorSetLayout(
1155+
mMaterialDomain, mVariantFilterMask,
1156+
mIsVariantLit || mHasShadowMultiplier, mReflectionMode, mRefractionMode);
1157+
1158+
// get the PER_RENDERABLE and PER_VIEW descriptor binding info
1159+
for (auto&& [bindingPoint, descriptorSetLayout] : {
1160+
std::pair{ DescriptorSetBindingPoints::PER_RENDERABLE,
1161+
descriptor_sets::getPerRenderableLayout() },
1162+
std::pair{ DescriptorSetBindingPoints::PER_VIEW,
1163+
perViewDescriptorSetLayout }}) {
1164+
Program::DescriptorBindingsInfo& descriptors = mProgramDescriptorBindings[+bindingPoint];
1165+
descriptors.reserve(descriptorSetLayout.bindings.size());
1166+
for (auto const& entry: descriptorSetLayout.bindings) {
1167+
auto const& name = descriptor_sets::getDescriptorName(bindingPoint, entry.binding);
1168+
descriptors.push_back({ name, entry.type, entry.binding });
1169+
}
1170+
}
1171+
11501172
mDescriptorSetLayout = {
11511173
engine.getDescriptorSetLayoutFactory(),
1152-
engine.getDriverApi(), std::move(descriptorSetLayout[0]) };
1174+
engine.getDriverApi(), std::move(descriptorSetLayout) };
11531175

11541176
mPerViewDescriptorSetLayout = {
11551177
engine.getDescriptorSetLayoutFactory(),
1156-
engine.getDriverApi(), std::move(descriptorSetLayout[1]) };
1178+
engine.getDriverApi(), perViewDescriptorSetLayout };
11571179
}
11581180

11591181
descriptor_binding_t FMaterial::getSamplerBinding(

libs/filamat/src/MaterialBuilder.cpp

+2-8
Original file line numberDiff line numberDiff line change
@@ -1610,15 +1610,9 @@ void MaterialBuilder::writeCommonChunks(ChunkContainer& container, MaterialInfo&
16101610
// User texture parameters
16111611
container.push<MaterialSamplerInterfaceBlockChunk>(info.sib);
16121612

1613-
1614-
DescriptorSetLayout const perViewDescriptorSetLayout =
1615-
descriptor_sets::getPerViewDescriptorSetLayout(
1616-
mMaterialDomain, mVariantFilter,
1617-
info.isLit || info.hasShadowMultiplier, info.reflectionMode, info.refractionMode);
1618-
16191613
// Descriptor layout and descriptor name/binding mapping
1620-
container.push<MaterialDescriptorBindingsChuck>(info.sib, perViewDescriptorSetLayout);
1621-
container.push<MaterialDescriptorSetLayoutChunk>(info.sib, perViewDescriptorSetLayout);
1614+
container.push<MaterialDescriptorBindingsChuck>(info.sib);
1615+
container.push<MaterialDescriptorSetLayoutChunk>(info.sib);
16221616

16231617
// User constant parameters
16241618
FixedCapacityVector<MaterialConstant> constantsEntry(mConstants.size());

libs/filamat/src/eiff/MaterialInterfaceBlockChunk.cpp

+15-60
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ namespace filamat {
3939

4040
MaterialUniformInterfaceBlockChunk::MaterialUniformInterfaceBlockChunk(
4141
BufferInterfaceBlock const& uib) :
42-
Chunk(ChunkType::MaterialUib),
42+
Chunk(MaterialUib),
4343
mUib(uib) {
4444
}
4545

@@ -60,7 +60,7 @@ void MaterialUniformInterfaceBlockChunk::flatten(Flattener& f) {
6060

6161
MaterialSamplerInterfaceBlockChunk::MaterialSamplerInterfaceBlockChunk(
6262
SamplerInterfaceBlock const& sib) :
63-
Chunk(ChunkType::MaterialSib),
63+
Chunk(MaterialSib),
6464
mSib(sib) {
6565
}
6666

@@ -81,7 +81,7 @@ void MaterialSamplerInterfaceBlockChunk::flatten(Flattener& f) {
8181
// ------------------------------------------------------------------------------------------------
8282

8383
MaterialSubpassInterfaceBlockChunk::MaterialSubpassInterfaceBlockChunk(SubpassInfo const& subpass) :
84-
Chunk(ChunkType::MaterialSubpass),
84+
Chunk(MaterialSubpass),
8585
mSubpass(subpass) {
8686
}
8787

@@ -101,8 +101,8 @@ void MaterialSubpassInterfaceBlockChunk::flatten(Flattener& f) {
101101
// ------------------------------------------------------------------------------------------------
102102

103103
MaterialConstantParametersChunk::MaterialConstantParametersChunk(
104-
utils::FixedCapacityVector<MaterialConstant> constants)
105-
: Chunk(ChunkType::MaterialConstants), mConstants(std::move(constants)) {}
104+
FixedCapacityVector<MaterialConstant> constants)
105+
: Chunk(MaterialConstants), mConstants(std::move(constants)) {}
106106

107107
void MaterialConstantParametersChunk::flatten(Flattener& f) {
108108
f.writeUint64(mConstants.size());
@@ -115,8 +115,8 @@ void MaterialConstantParametersChunk::flatten(Flattener& f) {
115115
// ------------------------------------------------------------------------------------------------
116116

117117
MaterialPushConstantParametersChunk::MaterialPushConstantParametersChunk(
118-
CString const& structVarName, utils::FixedCapacityVector<MaterialPushConstant> constants)
119-
: Chunk(ChunkType::MaterialPushConstants),
118+
CString const& structVarName, FixedCapacityVector<MaterialPushConstant> constants)
119+
: Chunk(MaterialPushConstants),
120120
mStructVarName(structVarName),
121121
mConstants(std::move(constants)) {}
122122

@@ -133,7 +133,7 @@ void MaterialPushConstantParametersChunk::flatten(Flattener& f) {
133133
// ------------------------------------------------------------------------------------------------
134134

135135
MaterialBindingUniformInfoChunk::MaterialBindingUniformInfoChunk(Container list) noexcept
136-
: Chunk(ChunkType::MaterialBindingUniformInfo),
136+
: Chunk(MaterialBindingUniformInfo),
137137
mBindingUniformInfo(std::move(list)) {
138138
}
139139

@@ -155,7 +155,7 @@ void MaterialBindingUniformInfoChunk::flatten(Flattener& f) {
155155
// ------------------------------------------------------------------------------------------------
156156

157157
MaterialAttributesInfoChunk::MaterialAttributesInfoChunk(Container list) noexcept
158-
: Chunk(ChunkType::MaterialAttributeInfo),
158+
: Chunk(MaterialAttributeInfo),
159159
mAttributeInfo(std::move(list))
160160
{
161161
}
@@ -170,11 +170,9 @@ void MaterialAttributesInfoChunk::flatten(Flattener& f) {
170170

171171
// ------------------------------------------------------------------------------------------------
172172

173-
MaterialDescriptorBindingsChuck::MaterialDescriptorBindingsChuck(Container const& sib,
174-
backend::DescriptorSetLayout const& perViewLayout) noexcept
175-
: Chunk(ChunkType::MaterialDescriptorBindingsInfo),
176-
mSamplerInterfaceBlock(sib),
177-
mPerViewLayout(perViewLayout) {
173+
MaterialDescriptorBindingsChuck::MaterialDescriptorBindingsChuck(Container const& sib) noexcept
174+
: Chunk(MaterialDescriptorBindingsInfo),
175+
mSamplerInterfaceBlock(sib) {
178176
}
179177

180178
void MaterialDescriptorBindingsChuck::flatten(Flattener& f) {
@@ -183,13 +181,6 @@ void MaterialDescriptorBindingsChuck::flatten(Flattener& f) {
183181

184182
using namespace backend;
185183

186-
187-
// number of descriptor-sets
188-
f.writeUint8(3);
189-
190-
// set
191-
f.writeUint8(+DescriptorSetBindingPoints::PER_MATERIAL);
192-
193184
// samplers + 1 descriptor for the UBO
194185
f.writeUint8(mSamplerInterfaceBlock.getSize() + 1);
195186

@@ -210,37 +201,13 @@ void MaterialDescriptorBindingsChuck::flatten(Flattener& f) {
210201
}
211202
f.writeUint8(entry.binding);
212203
}
213-
214-
// set
215-
f.writeUint8(+DescriptorSetBindingPoints::PER_RENDERABLE);
216-
f.writeUint8(descriptor_sets::getPerRenderableLayout().bindings.size());
217-
for (auto const& entry: descriptor_sets::getPerRenderableLayout().bindings) {
218-
auto const& name = descriptor_sets::getDescriptorName(
219-
DescriptorSetBindingPoints::PER_RENDERABLE, entry.binding);
220-
f.writeString({ name.data(), name.size() });
221-
f.writeUint8(uint8_t(entry.type));
222-
f.writeUint8(entry.binding);
223-
}
224-
225-
// set
226-
f.writeUint8(+DescriptorSetBindingPoints::PER_VIEW);
227-
f.writeUint8(mPerViewLayout.bindings.size());
228-
for (auto const& entry: mPerViewLayout.bindings) {
229-
auto const& name = descriptor_sets::getDescriptorName(
230-
DescriptorSetBindingPoints::PER_VIEW, entry.binding);
231-
f.writeString({ name.data(), name.size() });
232-
f.writeUint8(uint8_t(entry.type));
233-
f.writeUint8(entry.binding);
234-
}
235204
}
236205

237206
// ------------------------------------------------------------------------------------------------
238207

239-
MaterialDescriptorSetLayoutChunk::MaterialDescriptorSetLayoutChunk(Container const& sib,
240-
backend::DescriptorSetLayout const& perViewLayout) noexcept
241-
: Chunk(ChunkType::MaterialDescriptorSetLayoutInfo),
242-
mSamplerInterfaceBlock(sib),
243-
mPerViewLayout(perViewLayout) {
208+
MaterialDescriptorSetLayoutChunk::MaterialDescriptorSetLayoutChunk(Container const& sib) noexcept
209+
: Chunk(MaterialDescriptorSetLayoutInfo),
210+
mSamplerInterfaceBlock(sib) {
244211
}
245212

246213
void MaterialDescriptorSetLayoutChunk::flatten(Flattener& f) {
@@ -271,18 +238,6 @@ void MaterialDescriptorSetLayoutChunk::flatten(Flattener& f) {
271238
f.writeUint8(uint8_t(DescriptorFlags::NONE));
272239
f.writeUint16(0);
273240
}
274-
275-
// samplers + 1 descriptor for the UBO
276-
f.writeUint8(mPerViewLayout.bindings.size());
277-
278-
// all the material's sampler descriptors
279-
for (auto const& entry: mPerViewLayout.bindings) {
280-
f.writeUint8(uint8_t(entry.type));
281-
f.writeUint8(uint8_t(entry.stageFlags));
282-
f.writeUint8(entry.binding);
283-
f.writeUint8(uint8_t(entry.flags));
284-
f.writeUint16(entry.count);
285-
}
286241
}
287242

288243
} // namespace filamat

0 commit comments

Comments
 (0)