Files
filament/filament/src/MaterialParser.h
T

154 lines
5.5 KiB
C++

/*
* Copyright (C) 2017 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.
*/
#ifndef TNT_FILAMENT_MATERIALPARSER_H
#define TNT_FILAMENT_MATERIALPARSER_H
#include <filaflat/BlobDictionary.h>
#include <filaflat/ChunkContainer.h>
#include <filaflat/MaterialChunk.h>
#include <filament/MaterialEnums.h>
#include <backend/DriverEnums.h>
#include <filament/MaterialChunkType.h>
#include <utils/compiler.h>
#include <utils/CString.h>
#include <inttypes.h>
namespace filaflat {
class ChunkContainer;
class ShaderBuilder;
class Unflattener;
}
namespace filament {
class UniformInterfaceBlock;
class SamplerInterfaceBlock;
struct SubpassInfo;
class MaterialParser {
public:
MaterialParser(backend::Backend backend, const void* data, size_t size);
MaterialParser(MaterialParser const& rhs) noexcept = delete;
MaterialParser& operator=(MaterialParser const& rhs) noexcept = delete;
enum class ParseResult {
SUCCESS,
ERROR_MISSING_BACKEND,
ERROR_OTHER
};
ParseResult parse() noexcept;
// Accessors
bool getMaterialVersion(uint32_t* value) const noexcept;
bool getName(utils::CString*) const noexcept;
bool getUIB(UniformInterfaceBlock* uib) const noexcept;
bool getSIB(SamplerInterfaceBlock* sib) const noexcept;
bool getSubpasses(SubpassInfo* subpass) const noexcept;
bool getShaderModels(uint32_t* value) const noexcept;
bool getMaterialProperties(uint64_t* value) const noexcept;
bool getDepthWriteSet(bool* value) const noexcept;
bool getDepthWrite(bool* value) const noexcept;
bool getDoubleSidedSet(bool* value) const noexcept;
bool getDoubleSided(bool* value) const noexcept;
bool getCullingMode(backend::CullingMode* value) const noexcept;
bool getTransparencyMode(TransparencyMode* value) const noexcept;
bool getColorWrite(bool* value) const noexcept;
bool getDepthTest(bool* value) const noexcept;
bool getInterpolation(Interpolation* value) const noexcept;
bool getVertexDomain(VertexDomain* value) const noexcept;
bool getMaterialDomain(MaterialDomain* domain) const noexcept;
bool getShading(Shading*) const noexcept;
bool getBlendingMode(BlendingMode*) const noexcept;
bool getMaskThreshold(float*) const noexcept;
bool hasShadowMultiplier(bool*) const noexcept;
bool getRequiredAttributes(AttributeBitset*) const noexcept;
bool getRefractionMode(RefractionMode* value) const noexcept;
bool getRefractionType(RefractionType* value) const noexcept;
bool getReflectionMode(ReflectionMode* value) const noexcept;
bool hasCustomDepthShader(bool* value) const noexcept;
bool hasSpecularAntiAliasing(bool* value) const noexcept;
bool getSpecularAntiAliasingVariance(float* value) const noexcept;
bool getSpecularAntiAliasingThreshold(float* value) const noexcept;
bool getShader(filaflat::ShaderBuilder& shader, backend::ShaderModel shaderModel,
uint8_t variant, backend::ShaderType stage) noexcept;
private:
struct MaterialParserDetails {
MaterialParserDetails(backend::Backend backend, const void* data, size_t size);
template<typename T>
bool getFromSimpleChunk(filamat::ChunkType type, T* value) const noexcept;
private:
friend class MaterialParser;
class ManagedBuffer {
void* mStart = nullptr;
size_t mSize = 0;
public:
explicit ManagedBuffer(const void* start, size_t size)
: mStart(malloc(size)), mSize(size) {
memcpy(mStart, start, size);
}
~ManagedBuffer() noexcept { free(mStart); }
ManagedBuffer(ManagedBuffer const& rhs) = delete;
ManagedBuffer& operator=(ManagedBuffer const& rhs) = delete;
void* data() const noexcept { return mStart; }
void* begin() const noexcept { return mStart; }
void* end() const noexcept { return (uint8_t*)mStart + mSize; }
size_t size() const noexcept { return mSize; }
};
ManagedBuffer mManagedBuffer;
filaflat::ChunkContainer mChunkContainer;
// Keep MaterialChunk alive between calls to getShader to avoid reload the shader index.
filaflat::MaterialChunk mMaterialChunk;
filaflat::BlobDictionary mBlobDictionary;
filamat::ChunkType mMaterialTag = filamat::ChunkType::Unknown;
filamat::ChunkType mDictionaryTag = filamat::ChunkType::Unknown;
};
filaflat::ChunkContainer& getChunkContainer() noexcept;
filaflat::ChunkContainer const& getChunkContainer() const noexcept;
MaterialParserDetails mImpl;
};
struct ChunkUniformInterfaceBlock {
static bool unflatten(filaflat::Unflattener& unflattener, UniformInterfaceBlock* uib);
};
struct ChunkSamplerInterfaceBlock {
static bool unflatten(filaflat::Unflattener& unflattener, SamplerInterfaceBlock* sib);
};
struct ChunkSubpassInterfaceBlock {
static bool unflatten(filaflat::Unflattener& unflattener, SubpassInfo* sib);
};
} // namespace filament
#endif // TNT_FILAMENT_MATERIALPARSER_H