diff --git a/resources/Materials/TestSuite/_options.mtlx b/resources/Materials/TestSuite/_options.mtlx
index 49b0b7cc39..13254f79eb 100644
--- a/resources/Materials/TestSuite/_options.mtlx
+++ b/resources/Materials/TestSuite/_options.mtlx
@@ -84,5 +84,22 @@
Default is false to avoid overhead when not profiling.
-->
+
+
+
+
+
diff --git a/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.cpp b/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.cpp
index e2a197e1cc..761fd530f4 100644
--- a/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.cpp
+++ b/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.cpp
@@ -1006,6 +1006,8 @@ void TestSuiteOptions::print(std::ostream& output) const
output << "\tEnable Reference Quality: " << enableReferenceQuality << std::endl;
output << "\tOutput Directory: " << (outputDirectory.isEmpty() ? "(default)" : outputDirectory.asString()) << std::endl;
output << "\tEnable Tracing: " << enableTracing << std::endl;
+ output << "\tFrames Per Material: " << framesPerMaterial << std::endl;
+ output << "\tEnv Sample Count: " << envSampleCount << std::endl;
}
bool TestSuiteOptions::readOptions(const std::string& optionFile)
@@ -1033,6 +1035,8 @@ bool TestSuiteOptions::readOptions(const std::string& optionFile)
const std::string ENABLE_REFERENCE_QUALITY("enableReferenceQuality");
const std::string OUTPUT_DIRECTORY_STRING("outputDirectory");
const std::string ENABLE_TRACING_STRING("enableTracing");
+ const std::string FRAMES_PER_MATERIAL_STRING("framesPerMaterial");
+ const std::string ENV_SAMPLE_COUNT_STRING("envSampleCount");
overrideFiles.clear();
dumpGeneratedCode = false;
@@ -1041,6 +1045,8 @@ bool TestSuiteOptions::readOptions(const std::string& optionFile)
enableIndirectLighting = true;
enableReferenceQuality = false;
+ bool envSampleCountSet = false;
+
mx::DocumentPtr doc = mx::createDocument();
try
{
@@ -1148,10 +1154,28 @@ bool TestSuiteOptions::readOptions(const std::string& optionFile)
{
enableTracing = val->asA();
}
+ else if (name == FRAMES_PER_MATERIAL_STRING)
+ {
+ int frames = val->asA();
+ framesPerMaterial = (frames >= 1) ? static_cast(frames) : 1u;
+ }
+ else if (name == ENV_SAMPLE_COUNT_STRING)
+ {
+ int count = val->asA();
+ envSampleCount = (count >= 1) ? count : 1024;
+ envSampleCountSet = true;
+ }
}
}
}
+ // If reference quality is enabled and envSampleCount wasn't explicitly
+ // overridden, use the higher sample count for reference-quality rendering.
+ if (enableReferenceQuality && !envSampleCountSet)
+ {
+ envSampleCount = 4096;
+ }
+
// Handle direct and indirect lighting toggles.
if (!enableDirectLighting)
{
diff --git a/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.h b/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.h
index e6ae23f19f..d8e58c4e6a 100644
--- a/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.h
+++ b/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.h
@@ -126,6 +126,15 @@ class TestSuiteOptions
// Default is false to avoid overhead when not profiling.
bool enableTracing = false;
+ // Number of frames to render per material for GPU timing.
+ // Default is 1. Set higher (e.g., 5-10) for statistical validity.
+ // First frame often includes driver shader compilation overhead.
+ unsigned int framesPerMaterial = 1;
+
+ // Number of environment radiance samples for IBL lighting.
+ // Default is 1024. Lower values (1-16) are more representative of real-time rendering.
+ int envSampleCount = 1024;
+
// Helper to resolve output path for an artifact.
// If outputDirectory is set, returns outputDirectory/filename.
// Otherwise returns the original path unchanged.
diff --git a/source/MaterialXTest/MaterialXRenderGlsl/RenderGlsl.cpp b/source/MaterialXTest/MaterialXRenderGlsl/RenderGlsl.cpp
index 197c43c93e..81b5f82ffc 100644
--- a/source/MaterialXTest/MaterialXRenderGlsl/RenderGlsl.cpp
+++ b/source/MaterialXTest/MaterialXRenderGlsl/RenderGlsl.cpp
@@ -99,7 +99,7 @@ void GlslShaderRenderTester::registerLights(mx::DocumentPtr document,
// Apply light settings for render tests.
_lightHandler->setEnvRadianceMap(envRadiance);
_lightHandler->setEnvIrradianceMap(envIrradiance);
- _lightHandler->setEnvSampleCount(options.enableReferenceQuality ? 4096 : 1024);
+ _lightHandler->setEnvSampleCount(options.envSampleCount);
_lightHandler->setRefractionTwoSided(true);
}
@@ -356,7 +356,10 @@ bool GlslShaderRenderTester::runRenderer(const std::string& shaderName,
unsigned int width = (unsigned int) testOptions.renderSize[0] * supersampleFactor;
unsigned int height = (unsigned int) testOptions.renderSize[1] * supersampleFactor;
_renderer->setSize(width, height);
- _renderer->render();
+ for (unsigned int frame = 0; frame < testOptions.framesPerMaterial; frame++)
+ {
+ _renderer->render();
+ }
}
{
diff --git a/source/MaterialXTest/MaterialXRenderMsl/RenderMsl.mm b/source/MaterialXTest/MaterialXRenderMsl/RenderMsl.mm
index c6340101da..09bd40185b 100644
--- a/source/MaterialXTest/MaterialXRenderMsl/RenderMsl.mm
+++ b/source/MaterialXTest/MaterialXRenderMsl/RenderMsl.mm
@@ -103,7 +103,7 @@ bool runRenderer(const std::string& shaderName,
// Apply light settings for render tests.
_lightHandler->setEnvRadianceMap(envRadiance);
_lightHandler->setEnvIrradianceMap(envIrradiance);
- _lightHandler->setEnvSampleCount(options.enableReferenceQuality ? 4096 : 1024);
+ _lightHandler->setEnvSampleCount(options.envSampleCount);
_lightHandler->setRefractionTwoSided(true);
}
@@ -357,7 +357,10 @@ bool runRenderer(const std::string& shaderName,
unsigned int width = (unsigned int) testOptions.renderSize[0] * supersampleFactor;
unsigned int height = (unsigned int) testOptions.renderSize[1] * supersampleFactor;
_renderer->setSize(width, height);
- _renderer->render();
+ for (unsigned int frame = 0; frame < testOptions.framesPerMaterial; frame++)
+ {
+ _renderer->render();
+ }
}
{
diff --git a/source/MaterialXTest/MaterialXRenderSlang/RenderSlang.cpp b/source/MaterialXTest/MaterialXRenderSlang/RenderSlang.cpp
index 7a96b7af78..f67b370e01 100644
--- a/source/MaterialXTest/MaterialXRenderSlang/RenderSlang.cpp
+++ b/source/MaterialXTest/MaterialXRenderSlang/RenderSlang.cpp
@@ -98,7 +98,7 @@ void SlangShaderRenderTester::registerLights(mx::DocumentPtr document,
// Apply light settings for render tests.
_lightHandler->setEnvRadianceMap(envRadiance);
_lightHandler->setEnvIrradianceMap(envIrradiance);
- _lightHandler->setEnvSampleCount(options.enableReferenceQuality ? 4096 : 1024);
+ _lightHandler->setEnvSampleCount(options.envSampleCount);
_lightHandler->setRefractionTwoSided(true);
}
@@ -350,7 +350,10 @@ bool SlangShaderRenderTester::runRenderer(const std::string& shaderName,
unsigned int width = (unsigned int) testOptions.renderSize[0] * supersampleFactor;
unsigned int height = (unsigned int) testOptions.renderSize[1] * supersampleFactor;
_renderer->setSize(width, height);
- _renderer->render();
+ for (unsigned int frame = 0; frame < testOptions.framesPerMaterial; frame++)
+ {
+ _renderer->render();
+ }
}
{