Add material render state and pipeline caching

This commit is contained in:
2026-03-27 12:18:04 +08:00
parent 4b9a63098e
commit 9a5c187abc
9 changed files with 717 additions and 26 deletions

View File

@@ -70,6 +70,14 @@ TEST(MaterialLoader, LoadValidMaterialParsesRenderMetadata) {
materialFile << " \"tags\": {\n";
materialFile << " \"LightMode\": \"ForwardBase\",\n";
materialFile << " \"RenderType\": \"Transparent\"\n";
materialFile << " },\n";
materialFile << " \"renderState\": {\n";
materialFile << " \"cull\": \"Back\",\n";
materialFile << " \"blend\": true,\n";
materialFile << " \"srcBlend\": \"SrcAlpha\",\n";
materialFile << " \"dstBlend\": \"InvSrcAlpha\",\n";
materialFile << " \"depthWrite\": false,\n";
materialFile << " \"depthFunc\": \"LessEqual\"\n";
materialFile << " }\n";
materialFile << "}";
}
@@ -87,6 +95,12 @@ TEST(MaterialLoader, LoadValidMaterialParsesRenderMetadata) {
EXPECT_EQ(material->GetShaderPass(), "ForwardLit");
EXPECT_EQ(material->GetTag("LightMode"), "ForwardBase");
EXPECT_EQ(material->GetTag("RenderType"), "Transparent");
EXPECT_EQ(material->GetRenderState().cullMode, MaterialCullMode::Back);
EXPECT_TRUE(material->GetRenderState().blendEnable);
EXPECT_EQ(material->GetRenderState().srcBlend, MaterialBlendFactor::SrcAlpha);
EXPECT_EQ(material->GetRenderState().dstBlend, MaterialBlendFactor::InvSrcAlpha);
EXPECT_FALSE(material->GetRenderState().depthWriteEnable);
EXPECT_EQ(material->GetRenderState().depthFunc, MaterialComparisonFunc::LessEqual);
delete material;
std::remove(materialPath.string().c_str());
@@ -110,4 +124,21 @@ TEST(MaterialLoader, RejectsUnknownRenderQueueName) {
std::remove(materialPath.string().c_str());
}
TEST(MaterialLoader, RejectsUnknownRenderStateEnum) {
const std::filesystem::path materialPath =
std::filesystem::current_path() / "material_loader_invalid_render_state.material";
{
std::ofstream materialFile(materialPath);
ASSERT_TRUE(materialFile.is_open());
materialFile << "{ \"renderState\": { \"cull\": \"Sideways\" } }";
}
MaterialLoader loader;
LoadResult result = loader.Load(materialPath.string().c_str());
EXPECT_FALSE(result);
std::remove(materialPath.string().c_str());
}
} // namespace