Commit 69194e5f by Jamie Madill Committed by Commit Bot

Reduce variance in TextureUploadPerf.

This reduces the test time to run in several ms instead of almost seconds per iteration. It allows us to use the perf test runner harness to check test performance more accurately by increasing the sample count. It first reduces the test iteration count to reduce total test time. It also refactors the test contents to not allocate new objects and memory with every test iteration. This gives a better sampling of what the test is obsering: texture upload performance. Also allows tests that like to track GPU time to be used with the NULL device option. Bug: angleproject:3712 Change-Id: Idacc3e3b424f8882d7680769b27d1f04146ea65d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1707112Reviewed-by: 's avatarTobin Ehlis <tobine@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 27ee35e6
......@@ -312,6 +312,8 @@ double ANGLEPerfTest::normalizedTime(size_t value) const
std::string RenderTestParams::suffix() const
{
std::stringstream strstr;
switch (driver)
{
case angle::GLESDriverType::AngleEGL:
......@@ -328,21 +330,34 @@ std::string RenderTestParams::suffix() const
switch (getRenderer())
{
case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
return "_d3d11";
strstr << "_d3d11";
break;
case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
return "_d3d9";
strstr << "_d3d9";
break;
case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE:
return "_gl";
strstr << "_gl";
break;
case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
return "_gles";
strstr << "_gles";
break;
case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
return "_default";
strstr << "_default";
break;
case EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE:
return "_vulkan";
strstr << "_vulkan";
break;
default:
assert(0);
return "_unk";
}
if (eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
{
strstr << "_null";
}
return strstr.str();
}
ANGLERenderTest::ANGLERenderTest(const std::string &name, const RenderTestParams &testParams)
......
......@@ -175,4 +175,25 @@ class ANGLERenderTest : public ANGLEPerfTest
std::unique_ptr<angle::Library> mEntryPointsLib;
};
// Mixins.
namespace params
{
template <typename ParamsT>
ParamsT Offscreen(const ParamsT &input)
{
ParamsT output = input;
output.offscreen = true;
return output;
}
template <typename ParamsT>
ParamsT NullDevice(const ParamsT &input)
{
ParamsT output = input;
output.eglParameters.deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE;
output.trackGpuTime = false;
return output;
}
} // namespace params
#endif // PERF_TESTS_ANGLE_PERF_TEST_H_
......@@ -47,11 +47,6 @@ std::string DrawCallPerfParams::suffix() const
strstr << "_offscreen";
}
if (eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
{
strstr << "_null";
}
return strstr.str();
}
......@@ -102,18 +97,4 @@ DrawCallPerfParams DrawCallWGL()
params.driver = angle::GLESDriverType::SystemWGL;
return params;
}
DrawCallPerfParams Offscreen(const DrawCallPerfParams &input)
{
DrawCallPerfParams output = input;
output.offscreen = true;
return output;
}
DrawCallPerfParams NullDevice(const DrawCallPerfParams &input)
{
DrawCallPerfParams output = input;
output.eglParameters.deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE;
return output;
}
} // namespace params
......@@ -35,10 +35,6 @@ DrawCallPerfParams DrawCallOpenGL();
DrawCallPerfParams DrawCallValidation();
DrawCallPerfParams DrawCallVulkan();
DrawCallPerfParams DrawCallWGL();
// Mixins.
DrawCallPerfParams Offscreen(const DrawCallPerfParams &input);
DrawCallPerfParams NullDevice(const DrawCallPerfParams &input);
} // namespace params
#endif // TESTS_PERF_TESTS_DRAW_CALL_PERF_PARAMS_H_
......@@ -20,7 +20,7 @@ using namespace angle;
namespace
{
constexpr unsigned int kIterationsPerStep = 64;
constexpr unsigned int kIterationsPerStep = 2;
struct TextureUploadParams final : public RenderTestParams
{
......@@ -75,9 +75,11 @@ class TextureUploadBenchmarkBase : public ANGLERenderTest,
protected:
void initShaders();
GLuint mProgram;
GLuint mPositionLoc;
GLuint mSamplerLoc;
GLuint mProgram = 0;
GLint mPositionLoc = -1;
GLint mSamplerLoc = -1;
GLuint mTexture = 0;
std::vector<float> mTextureData;
};
class TextureUploadSubImageBenchmark : public TextureUploadBenchmarkBase
......@@ -88,6 +90,14 @@ class TextureUploadSubImageBenchmark : public TextureUploadBenchmarkBase
addExtensionPrerequisite("GL_EXT_texture_storage");
}
void initializeBenchmark() override
{
TextureUploadBenchmarkBase::initializeBenchmark();
const auto &params = GetParam();
glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, params.baseSize, params.baseSize);
}
void drawBenchmark() override;
};
......@@ -100,7 +110,7 @@ class TextureUploadFullMipBenchmark : public TextureUploadBenchmarkBase
};
TextureUploadBenchmarkBase::TextureUploadBenchmarkBase(const char *benchmarkName)
: ANGLERenderTest(benchmarkName, GetParam()), mProgram(0u), mPositionLoc(-1), mSamplerLoc(-1)
: ANGLERenderTest(benchmarkName, GetParam())
{
setWebGLCompatibilityEnabled(GetParam().webgl);
setRobustResourceInit(GetParam().webgl);
......@@ -125,6 +135,18 @@ void TextureUploadBenchmarkBase::initializeBenchmark()
glRequestExtensionANGLE("GL_EXT_disjoint_timer_query");
}
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &mTexture);
glBindTexture(GL_TEXTURE_2D, mTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
ASSERT_TRUE(params.baseSize >= params.subImageSize);
mTextureData.resize(params.baseSize * params.baseSize * 4, 0.5);
ASSERT_GL_NO_ERROR();
}
......@@ -149,6 +171,7 @@ void main()
mPositionLoc = glGetAttribLocation(mProgram, "a_position");
mSamplerLoc = glGetUniformLocation(mProgram, "s_texture");
glUseProgram(mProgram);
glUniform1i(mSamplerLoc, 0);
glDisable(GL_DEPTH_TEST);
......@@ -157,6 +180,7 @@ void main()
void TextureUploadBenchmarkBase::destroyBenchmark()
{
glDeleteTextures(1, &mTexture);
glDeleteProgram(mProgram);
}
......@@ -164,27 +188,12 @@ void TextureUploadSubImageBenchmark::drawBenchmark()
{
const auto &params = GetParam();
std::vector<float> textureData(params.subImageSize * params.subImageSize * 4, 0.5);
GLTexture tex;
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, params.baseSize, params.baseSize);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glUniform1i(mSamplerLoc, 0);
ASSERT_GL_NO_ERROR();
startGpuTimer();
for (unsigned int iteration = 0; iteration < params.iterationsPerStep; ++iteration)
{
glTexSubImage2D(GL_TEXTURE_2D, 0, rand() % (params.baseSize - params.subImageSize),
rand() % (params.baseSize - params.subImageSize), params.subImageSize,
params.subImageSize, GL_RGBA, GL_UNSIGNED_BYTE, textureData.data());
params.subImageSize, GL_RGBA, GL_UNSIGNED_BYTE, mTextureData.data());
// Perform a draw just so the texture data is flushed. With the position attributes not
// set, a constant default value is used, resulting in a very cheap draw.
......@@ -199,31 +208,17 @@ void TextureUploadFullMipBenchmark::drawBenchmark()
{
const auto &params = GetParam();
std::vector<float> textureData(params.baseSize * params.baseSize * 4, 0.5);
startGpuTimer();
for (size_t it = 0; it < params.iterationsPerStep; ++it)
{
GLTexture tex;
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
// Stage data for all mips
GLint mip = 0;
for (GLsizei levelSize = params.baseSize; levelSize > 0; levelSize >>= 1)
{
glTexImage2D(GL_TEXTURE_2D, mip++, GL_RGBA, levelSize, levelSize, 0, GL_RGBA,
GL_UNSIGNED_BYTE, textureData.data());
GL_UNSIGNED_BYTE, mTextureData.data());
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glUniform1i(mSamplerLoc, 0);
// Perform a draw just so the texture data is flushed. With the position attributes not
// set, a constant default value is used, resulting in a very cheap draw.
glDrawArrays(GL_TRIANGLES, 0, 3);
......@@ -269,12 +264,15 @@ TEST_P(TextureUploadFullMipBenchmark, Run)
run();
}
using namespace params;
ANGLE_INSTANTIATE_TEST(TextureUploadSubImageBenchmark,
D3D11Params(false),
D3D11Params(true),
OpenGLOrGLESParams(false),
OpenGLOrGLESParams(true),
VulkanParams(false),
NullDevice(VulkanParams(false)),
VulkanParams(true));
ANGLE_INSTANTIATE_TEST(TextureUploadFullMipBenchmark,
......@@ -283,4 +281,5 @@ ANGLE_INSTANTIATE_TEST(TextureUploadFullMipBenchmark,
OpenGLOrGLESParams(false),
OpenGLOrGLESParams(true),
VulkanParams(false),
NullDevice(VulkanParams(false)),
VulkanParams(true));
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment