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(); + } } {