/*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// Enable debug log for test coverage
#define DEBUG_ENABLED 1
+#include <dali-test-suite-utils.h>
+#include <set>
+#include <string_view>
#include "dali-scene-loader/public-api/gltf2-loader.h"
-#include "dali-scene-loader/public-api/shader-definition-factory.h"
#include "dali-scene-loader/public-api/node-definition.h"
#include "dali-scene-loader/public-api/resource-bundle.h"
-#include <dali-test-suite-utils.h>
-#include <string_view>
-#include <set>
+#include "dali-scene-loader/public-api/shader-definition-factory.h"
using namespace Dali;
using namespace Dali::SceneLoader;
namespace
{
-
-bool EndsWith(const std::string& str, const std::string& suffix) // ends_width() is C++20
-{
- return str.size() >= suffix.size() && str.substr(str.size() - suffix.size()).compare(suffix) == 0;
-}
-
MaterialDefinition& NewMaterialDefinition(ResourceBundle& resources)
{
resources.mMaterials.push_back({});
struct Context
{
- ResourceBundle resources;
+ ResourceBundle resources;
ShaderDefinitionFactory factory;
Context()
struct ShaderParameters
{
- MeshDefinition& meshDef;
+ MeshDefinition& meshDef;
MaterialDefinition& materialDef;
- NodeDefinition& nodeDef;
+ NodeDefinition& nodeDef;
};
struct Permutation
{
- using ConfigureFn = void(*)(ShaderParameters&);
+ using ConfigureFn = void (*)(ShaderParameters&);
ConfigureFn configureFn;
std::set<std::string> defines;
- RendererState::Type rendererStateSet = 0;
- RendererState::Type rendererStateClear = 0;
+ RendererState::Type rendererStateSet = 0;
+ RendererState::Type rendererStateClear = 0;
};
struct PermutationSet
{
std::vector<const Permutation*> permutations;
- Index shaderIdx;
+ Index shaderIdx;
};
-}
+} // namespace
int UtcDaliShaderDefinitionFactoryProduceShaderInvalid(void)
{
[](ShaderParameters& p) {
p.materialDef.mFlags |= MaterialDefinition::TRANSPARENCY;
},
- { "THREE_TEX" },
+ {"THREE_TEX"},
RendererState::ALPHA_BLEND,
RendererState::DEPTH_WRITE,
},
- {
- [](ShaderParameters& p) {
- p.materialDef.mTextureStages.push_back({ MaterialDefinition::ALBEDO, {} });
- },
- { "THREE_TEX" }
- },
- {
- [](ShaderParameters& p) {
- p.materialDef.mTextureStages.push_back({ MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS, {} });
- },
- { "THREE_TEX" }
- },
- {
- [](ShaderParameters& p) {
- p.materialDef.mTextureStages.push_back({ MaterialDefinition::NORMAL, {} });
- },
- { "THREE_TEX" }
- },
- {
- [](ShaderParameters& p) {
- p.materialDef.mFlags |= MaterialDefinition::SUBSURFACE;
- },
- { "SSS" }
- },
- {
- [](ShaderParameters& p) {
- p.materialDef.SetAlphaCutoff(.5f);
- },
- { "ALPHA_TEST" }
- },
- {
- [](ShaderParameters& p) {
- p.materialDef.SetAlphaCutoff(1.f);
- },
- { "ALPHA_TEST" }
- },
- {
- [](ShaderParameters& p) {
- p.materialDef.mFlags |= MaterialDefinition::GLTF_CHANNELS;
- },
- { "GLTF_CHANNELS" }
- },
- {
- [](ShaderParameters& p) {
- p.meshDef.mJoints0.mBlob.mOffset = 0;
- p.meshDef.mWeights0.mBlob.mOffset = 0;
- },
- { "SKINNING" }
- },
- {
- [](ShaderParameters& p) {
- p.meshDef.mFlags |= MeshDefinition::FLIP_UVS_VERTICAL;
- },
- { "FLIP_V" }
- },
+ {[](ShaderParameters& p) {
+ p.materialDef.mTextureStages.push_back({MaterialDefinition::ALBEDO, {}});
+ },
+ {"THREE_TEX"}},
+ {[](ShaderParameters& p) {
+ p.materialDef.mTextureStages.push_back({MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS, {}});
+ },
+ {"THREE_TEX"}},
+ {[](ShaderParameters& p) {
+ p.materialDef.mTextureStages.push_back({MaterialDefinition::NORMAL, {}});
+ },
+ {"THREE_TEX"}},
+ {[](ShaderParameters& p) {
+ p.materialDef.mFlags |= MaterialDefinition::SUBSURFACE;
+ },
+ {"SSS"}},
+ {[](ShaderParameters& p) {
+ p.materialDef.SetAlphaCutoff(.5f);
+ },
+ {"ALPHA_TEST"}},
+ {[](ShaderParameters& p) {
+ p.materialDef.SetAlphaCutoff(1.f);
+ },
+ {"ALPHA_TEST"}},
+ {[](ShaderParameters& p) {
+ p.materialDef.mFlags |= MaterialDefinition::GLTF_CHANNELS;
+ },
+ {"GLTF_CHANNELS"}},
+ {[](ShaderParameters& p) {
+ p.meshDef.mJoints0.mBlob.mOffset = 0;
+ p.meshDef.mWeights0.mBlob.mOffset = 0;
+ },
+ {"SKINNING"}},
+ {[](ShaderParameters& p) {
+ p.meshDef.mFlags |= MeshDefinition::FLIP_UVS_VERTICAL;
+ },
+ {"FLIP_V"}},
{
[](ShaderParameters& p) {
p.meshDef.mBlendShapes.push_back({});
},
},
- {
- [](ShaderParameters& p) {
- p.meshDef.mBlendShapes.back().deltas.mBlob.mOffset = 0;
- },
- { "MORPH_POSITION", "MORPH" }
- },
- {
- [](ShaderParameters& p) {
- p.meshDef.mBlendShapes.back().normals.mBlob.mOffset = 0;
- },
- { "MORPH_NORMAL", "MORPH" }
- },
- {
- [](ShaderParameters& p) {
- p.meshDef.mBlendShapes.back().tangents.mBlob.mOffset = 0;
- },
- { "MORPH_TANGENT", "MORPH" }
- },
- {
- [](ShaderParameters& p) {
- auto& blendShapes = p.meshDef.mBlendShapes;
- DALI_ASSERT_ALWAYS(!blendShapes.empty() &&
- (blendShapes.back().deltas.mBlob.mOffset != MeshDefinition::INVALID ||
- blendShapes.back().normals.mBlob.mOffset != MeshDefinition::INVALID ||
- blendShapes.back().tangents.mBlob.mOffset != MeshDefinition::INVALID));
- p.meshDef.mBlendShapeVersion = BlendShapes::Version::VERSION_2_0;
- },
- { "MORPH_VERSION_2_0" }
- },
+ {[](ShaderParameters& p) {
+ p.meshDef.mBlendShapes.back().deltas.mBlob.mOffset = 0;
+ },
+ {"MORPH_POSITION", "MORPH"}},
+ {[](ShaderParameters& p) {
+ p.meshDef.mBlendShapes.back().normals.mBlob.mOffset = 0;
+ },
+ {"MORPH_NORMAL", "MORPH"}},
+ {[](ShaderParameters& p) {
+ p.meshDef.mBlendShapes.back().tangents.mBlob.mOffset = 0;
+ },
+ {"MORPH_TANGENT", "MORPH"}},
+ {[](ShaderParameters& p) {
+ auto& blendShapes = p.meshDef.mBlendShapes;
+ DALI_ASSERT_ALWAYS(!blendShapes.empty() &&
+ (blendShapes.back().deltas.mBlob.mOffset != MeshDefinition::INVALID ||
+ blendShapes.back().normals.mBlob.mOffset != MeshDefinition::INVALID ||
+ blendShapes.back().tangents.mBlob.mOffset != MeshDefinition::INVALID));
+ p.meshDef.mBlendShapeVersion = BlendShapes::Version::VERSION_2_0;
+ },
+ {"MORPH_VERSION_2_0"}},
+
+ {[](ShaderParameters& p) {
+ p.materialDef.mFlags |= MaterialDefinition::OCCLUSION;
+ },
+
+ {"OCCLUSION"}},
};
- PermutationSet permSets[] {
+ PermutationSet permSets[]{
// default
- { { &permutations[0] }, 0 },
+ {{&permutations[0]}, 0},
// alpha
- { { &permutations[0], &permutations[1] }, 1 },
+ {{&permutations[0], &permutations[1]}, 1},
// three-texture setups
- { { &permutations[0], &permutations[2] }, 2 },
- { { &permutations[0], &permutations[3] }, 2 },
- { { &permutations[0], &permutations[4] }, 2 },
- { { &permutations[0], &permutations[2], &permutations[3] }, 2 },
- { { &permutations[0], &permutations[3], &permutations[4] }, 2 },
- { { &permutations[0], &permutations[4], &permutations[2] }, 2 },
- { { &permutations[0], &permutations[2], &permutations[3], &permutations[4] }, 2 },
+ {{&permutations[0], &permutations[2]}, 2},
+ {{&permutations[0], &permutations[3]}, 2},
+ {{&permutations[0], &permutations[4]}, 2},
+ {{&permutations[0], &permutations[2], &permutations[3]}, 2},
+ {{&permutations[0], &permutations[3], &permutations[4]}, 2},
+ {{&permutations[0], &permutations[4], &permutations[2]}, 2},
+ {{&permutations[0], &permutations[2], &permutations[3], &permutations[4]}, 2},
// subsurface scattering
- { { &permutations[0], &permutations[5] }, 3 },
+ {{&permutations[0], &permutations[5]}, 3},
// alpha test
- { { &permutations[0], &permutations[6] }, 4 },
- { { &permutations[0], &permutations[7] }, 4 },
+ {{&permutations[0], &permutations[6]}, 4},
+ {{&permutations[0], &permutations[7]}, 4},
// glTF channels
- { { &permutations[0], &permutations[8] }, 5 },
+ {{&permutations[0], &permutations[8]}, 5},
// skinning
- { { &permutations[0], &permutations[9] }, 6 },
+ {{&permutations[0], &permutations[9]}, 6},
// flip uvs
- { { &permutations[0], &permutations[10] }, 7 },
+ {{&permutations[0], &permutations[10]}, 7},
// morphing
- { { &permutations[0], &permutations[11], &permutations[12] }, 8 },
- { { &permutations[0], &permutations[11], &permutations[13] }, 9 },
- { { &permutations[0], &permutations[11], &permutations[14] }, 10 },
- { { &permutations[0], &permutations[11], &permutations[12], &permutations[13] }, 11 },
- { { &permutations[0], &permutations[11], &permutations[13], &permutations[14] }, 12 },
- { { &permutations[0], &permutations[11], &permutations[14], &permutations[12] }, 13 },
- { { &permutations[0], &permutations[11], &permutations[12], &permutations[13], &permutations[14] }, 14 },
-
- { { &permutations[0], &permutations[11], &permutations[12], &permutations[15] }, 15 },
- { { &permutations[0], &permutations[11], &permutations[13], &permutations[15] }, 16 },
- { { &permutations[0], &permutations[11], &permutations[14], &permutations[15] }, 17 },
- { { &permutations[0], &permutations[11], &permutations[12], &permutations[13], &permutations[15] }, 18 },
- { { &permutations[0], &permutations[11], &permutations[13], &permutations[14], &permutations[15] }, 19 },
- { { &permutations[0], &permutations[11], &permutations[14], &permutations[12], &permutations[15] }, 20 },
- { { &permutations[0], &permutations[11], &permutations[12], &permutations[13], &permutations[14], &permutations[15] }, 21 },
+ {{&permutations[0], &permutations[11], &permutations[12]}, 8},
+ {{&permutations[0], &permutations[11], &permutations[13]}, 9},
+ {{&permutations[0], &permutations[11], &permutations[14]}, 10},
+ {{&permutations[0], &permutations[11], &permutations[12], &permutations[13]}, 11},
+ {{&permutations[0], &permutations[11], &permutations[13], &permutations[14]}, 12},
+ {{&permutations[0], &permutations[11], &permutations[14], &permutations[12]}, 13},
+ {{&permutations[0], &permutations[11], &permutations[12], &permutations[13], &permutations[14]}, 14},
+
+ {{&permutations[0], &permutations[11], &permutations[12], &permutations[15]}, 15},
+ {{&permutations[0], &permutations[11], &permutations[13], &permutations[15]}, 16},
+ {{&permutations[0], &permutations[11], &permutations[14], &permutations[15]}, 17},
+ {{&permutations[0], &permutations[11], &permutations[12], &permutations[13], &permutations[15]}, 18},
+ {{&permutations[0], &permutations[11], &permutations[13], &permutations[14], &permutations[15]}, 19},
+ {{&permutations[0], &permutations[11], &permutations[14], &permutations[12], &permutations[15]}, 20},
+ {{&permutations[0], &permutations[11], &permutations[12], &permutations[13], &permutations[14], &permutations[15]}, 21},
// etc.
- { { &permutations[0], &permutations[1], &permutations[2] }, 1 },
- { { &permutations[0], &permutations[1], &permutations[3] }, 1 },
- { { &permutations[0], &permutations[1], &permutations[2], &permutations[3] }, 1 },
+ {{&permutations[0], &permutations[1], &permutations[2]}, 1},
+ {{&permutations[0], &permutations[1], &permutations[3]}, 1},
+ {{&permutations[0], &permutations[1], &permutations[2], &permutations[3]}, 1},
+
+ // occlusion
+ {{&permutations[0], &permutations[16]}, 22},
};
- for(auto& ps: permSets)
+
+ for(auto& ps : permSets)
{
printf("%ld\n", &ps - permSets);
- auto modelNode = new ModelNode();
- modelNode->mMeshIdx = 0;
+ auto modelNode = new ModelNode();
+ modelNode->mMeshIdx = 0;
modelNode->mMaterialIdx = 0;
NodeDefinition nodeDef;
nodeDef.mRenderable.reset(modelNode);
- auto& meshDef = NewMeshDefinition(ctx.resources);
- auto& materialDef = NewMaterialDefinition(ctx.resources);
- ShaderParameters sp{ meshDef, materialDef, nodeDef };
+ auto& meshDef = NewMeshDefinition(ctx.resources);
+ auto& materialDef = NewMaterialDefinition(ctx.resources);
+ ShaderParameters sp{meshDef, materialDef, nodeDef};
std::set<std::string> defines;
- RendererState::Type rendererState = 0;
- for (auto p : ps.permutations)
+ RendererState::Type rendererState = 0;
+ for(auto p : ps.permutations)
{
p->configureFn(sp);
defines.insert(p->defines.begin(), p->defines.end());
DALI_TEST_EQUAL(ps.shaderIdx, shaderIdx);
auto& shaderDef = ctx.resources.mShaders[shaderIdx].first;
- DALI_TEST_CHECK(EndsWith(shaderDef.mVertexShaderPath, ".vsh"));
- DALI_TEST_CHECK(EndsWith(shaderDef.mFragmentShaderPath, ".fsh"));
DALI_TEST_EQUAL(shaderDef.mRendererState, rendererState);
uint32_t definesUnmatched = shaderDef.mDefines.size();
- for (auto& d: shaderDef.mDefines)
+ for(auto& d : shaderDef.mDefines)
{
auto iFind = defines.find(d);
- if (iFind != defines.end())
+ if(iFind != defines.end())
{
defines.erase(iFind);
--definesUnmatched;