Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 5b35c7f

Browse files
null77Commit Bot
authored andcommitted
Fix up screenshot saving for trace tests.
Now works when run in a sequence. Also saves RGB images to avoid issues with the alpha being inconsistent and also flips images vertically to fix the rendering. Bug: angleproject:4615 Change-Id: I8d3b38c5d914e0ca2227320ac42a0e28acd12c4d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2187971 Commit-Queue: Jamie Madill <[email protected]> Reviewed-by: Cody Northrop <[email protected]>
1 parent 234ea5b commit 5b35c7f

File tree

6 files changed

+69
-50
lines changed

6 files changed

+69
-50
lines changed

src/tests/BUILD.gn

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,7 @@ template("angle_perftests_common") {
238238
"perf_tests/third_party/perf/perf_test.cc",
239239
"perf_tests/third_party/perf/perf_test.h",
240240
]
241-
deps = [
242-
"$angle_jsoncpp_dir:jsoncpp",
243-
"$angle_root/util:angle_png_utils",
244-
]
241+
deps = [ "$angle_jsoncpp_dir:jsoncpp" ]
245242
public_deps = [ "${invoker.test_utils}" ]
246243
public_configs += [ "${angle_root}:libANGLE_config" ]
247244
}
@@ -328,6 +325,7 @@ if (is_win || is_linux || is_android || is_mac || is_fuchsia) {
328325
deps = [
329326
":angle_perftests_shared",
330327
"$angle_root:angle_compression",
328+
"$angle_root/util:angle_png_utils",
331329
]
332330
suppressed_configs +=
333331
[ "$angle_root:constructor_and_destructor_warnings" ]

src/tests/perf_tests/ANGLEPerfTest.cpp

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include "common/utilities.h"
1717
#include "third_party/perf/perf_test.h"
1818
#include "third_party/trace_event/trace_event.h"
19-
#include "util/png_utils.h"
2019
#include "util/shader_utils.h"
2120
#include "util/test_utils.h"
2221

@@ -565,6 +564,16 @@ void ANGLERenderTest::SetUp()
565564
FAIL() << "Please initialize 'iterationsPerStep'.";
566565
// FAIL returns.
567566
}
567+
568+
// Capture a screenshot if enabled.
569+
if (gScreenShotDir != nullptr)
570+
{
571+
std::stringstream screenshotNameStr;
572+
screenshotNameStr << gScreenShotDir << GetPathSeparator() << "angle" << mBackend << "_"
573+
<< mStory << ".png";
574+
std::string screenshotName = screenshotNameStr.str();
575+
saveScreenshot(screenshotName);
576+
}
568577
}
569578

570579
void ANGLERenderTest::TearDown()
@@ -655,9 +664,6 @@ void ANGLERenderTest::step()
655664
{
656665
drawBenchmark();
657666

658-
// Saves a screenshot. The test will also exit early if we're taking screenshots.
659-
saveScreenshotIfEnabled();
660-
661667
// Swap is needed so that the GPU driver will occasionally flush its
662668
// internal command queue to the GPU. This is enabled for null back-end
663669
// devices because some back-ends (e.g. Vulkan) also accumulate internal
@@ -758,33 +764,6 @@ std::vector<TraceEvent> &ANGLERenderTest::getTraceEventBuffer()
758764
return mTraceEventBuffer;
759765
}
760766

761-
void ANGLERenderTest::saveScreenshotIfEnabled()
762-
{
763-
if (gScreenShotDir == nullptr)
764-
{
765-
return;
766-
}
767-
768-
std::stringstream screenshotNameStr;
769-
screenshotNameStr << gScreenShotDir << GetPathSeparator() << "angle" << mBackend << "_"
770-
<< mStory << ".png";
771-
std::string screenshotName = screenshotNameStr.str();
772-
773-
// RGBA 4-byte data.
774-
std::vector<uint8_t> pixelData(mTestParams.windowWidth * mTestParams.windowHeight * 4);
775-
776-
glBindFramebuffer(GL_FRAMEBUFFER, 0);
777-
glReadPixels(0, 0, mTestParams.windowWidth, mTestParams.windowHeight, GL_RGBA, GL_UNSIGNED_BYTE,
778-
pixelData.data());
779-
780-
angle::SavePNG(screenshotName.c_str(), "ANGLE Screenshot", mTestParams.windowWidth,
781-
mTestParams.windowHeight, pixelData);
782-
783-
// Early exit.
784-
abortTest();
785-
mSkipTest = true;
786-
}
787-
788767
namespace angle
789768
{
790769
double GetHostTimeSeconds()

src/tests/perf_tests/ANGLEPerfTest.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ class ANGLEPerfTest : public testing::Test, angle::NonCopyable
8585
unsigned int getNumStepsPerformed() const { return mNumStepsPerformed; }
8686
void doRunLoop(double maxRunTime);
8787

88+
// Overriden in trace perf tests.
89+
virtual void saveScreenshot(const std::string &screenshotName) {}
90+
8891
std::string mName;
8992
std::string mBackend;
9093
std::string mStory;
@@ -154,8 +157,6 @@ class ANGLERenderTest : public ANGLEPerfTest
154157

155158
bool mIsTimestampQueryAvailable;
156159

157-
void saveScreenshotIfEnabled();
158-
159160
private:
160161
void SetUp() override;
161162
void TearDown() override;

src/tests/perf_tests/TracePerfTest.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "tests/perf_tests/DrawCallPerfParams.h"
1515
#include "util/egl_loader_autogen.h"
1616
#include "util/frame_capture_utils.h"
17+
#include "util/png_utils.h"
1718

1819
#include "restricted_traces/restricted_traces_autogen.h"
1920

@@ -90,6 +91,7 @@ class TracePerfTest : public ANGLERenderTest, public ::testing::WithParamInterfa
9091
};
9192

9293
void sampleTime();
94+
void saveScreenshot(const std::string &screenshotName) override;
9395

9496
// For tracking RenderPass/FBO change timing.
9597
QueryInfo mCurrentQuery = {};
@@ -292,6 +294,45 @@ void TracePerfTest::onFramebufferChange(GLenum target, GLuint framebuffer)
292294
mCurrentQuery.framebuffer = framebuffer;
293295
}
294296

297+
void TracePerfTest::saveScreenshot(const std::string &screenshotName)
298+
{
299+
// Render a single frame.
300+
RestrictedTraceID testID = GetParam().testID;
301+
const TraceInfo &traceInfo = kTraceInfos[testID];
302+
ReplayFrame(testID, traceInfo.startFrame);
303+
304+
// RGBA 4-byte data.
305+
uint32_t pixelCount = mTestParams.windowWidth * mTestParams.windowHeight;
306+
std::vector<uint8_t> pixelData(pixelCount * 4);
307+
308+
glBindFramebuffer(GL_FRAMEBUFFER, 0);
309+
glReadPixels(0, 0, mTestParams.windowWidth, mTestParams.windowHeight, GL_RGBA, GL_UNSIGNED_BYTE,
310+
pixelData.data());
311+
312+
// Convert to RGB and flip y.
313+
std::vector<uint8_t> rgbData(pixelCount * 3);
314+
for (EGLint y = 0; y < mTestParams.windowHeight; ++y)
315+
{
316+
for (EGLint x = 0; x < mTestParams.windowWidth; ++x)
317+
{
318+
EGLint srcPixel = x + y * mTestParams.windowWidth;
319+
EGLint dstPixel = x + (mTestParams.windowHeight - y - 1) * mTestParams.windowWidth;
320+
memcpy(&rgbData[dstPixel * 3], &pixelData[srcPixel * 4], 3);
321+
}
322+
}
323+
324+
angle::SavePNGRGB(screenshotName.c_str(), "ANGLE Screenshot", mTestParams.windowWidth,
325+
mTestParams.windowHeight, rgbData);
326+
327+
// Finish the frame loop.
328+
for (uint32_t nextFrame = traceInfo.startFrame + 1; nextFrame < traceInfo.endFrame; ++nextFrame)
329+
{
330+
ReplayFrame(testID, nextFrame);
331+
}
332+
getGLWindow()->swap();
333+
glFinish();
334+
}
335+
295336
ANGLE_MAYBE_UNUSED void FramebufferChangeCallback(void *userData, GLenum target, GLuint framebuffer)
296337
{
297338
reinterpret_cast<TracePerfTest *>(userData)->onFramebufferChange(target, framebuffer);

util/png_utils.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ class ScopedFILE
3939
};
4040
} // namespace
4141

42-
bool SavePNG(const char *fileName,
43-
const char *title,
44-
uint32_t width,
45-
uint32_t height,
46-
const std::vector<uint8_t> &data)
42+
bool SavePNGRGB(const char *fileName,
43+
const char *title,
44+
uint32_t width,
45+
uint32_t height,
46+
const std::vector<uint8_t> &data)
4747
{
4848
ScopedFILE fp(fopen(fileName, "wb"));
4949
if (!fp.get())
@@ -78,7 +78,7 @@ bool SavePNG(const char *fileName,
7878
png_init_io(writeStruct, fp.get());
7979

8080
// Write header (8 bit colour depth)
81-
png_set_IHDR(writeStruct, infoStruct, width, height, 8, PNG_COLOR_TYPE_RGBA, PNG_INTERLACE_NONE,
81+
png_set_IHDR(writeStruct, infoStruct, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
8282
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
8383

8484
// Set title
@@ -98,8 +98,8 @@ bool SavePNG(const char *fileName,
9898

9999
png_write_info(writeStruct, infoStruct);
100100

101-
// RGBA 4-byte stride.
102-
const uint32_t rowStride = width * 4;
101+
// RGB 3-byte stride.
102+
const uint32_t rowStride = width * 3;
103103
for (uint32_t row = 0; row < height; ++row)
104104
{
105105
uint32_t rowOffset = row * rowStride;

util/png_utils.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414

1515
namespace angle
1616
{
17-
bool SavePNG(const char *fileName,
18-
const char *title,
19-
uint32_t width,
20-
uint32_t height,
21-
const std::vector<uint8_t> &data);
17+
bool SavePNGRGB(const char *fileName,
18+
const char *title,
19+
uint32_t width,
20+
uint32_t height,
21+
const std::vector<uint8_t> &rgbData);
2222
} // namespace angle
2323

2424
#endif // UTIL_PNG_UTILS_H_

0 commit comments

Comments
 (0)