Hash :
81a244de
Author :
Date :
2022-10-10T15:32:25
Adding a class to perform ASTC texture decompression on the CPU This significantly improves performance by caching and re-using the ASTC decoder context, and using multi-threaded decompression. This code was originally written for gfxstream. Bug: b/250688943 Change-Id: I1727447907f2e25cf9b854ffcc9ccfc04db2fb91 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3929008 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
//
// Copyright 2022 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// AstcDecompressorPerf: Performance test for the ASTC decompressor.
//
#include "ANGLEPerfTest.h"
#include <gmock/gmock.h>
#include "common/WorkerThread.h"
#include "image_util/AstcDecompressor.h"
#include "image_util/AstcDecompressorTestUtils.h"
using namespace testing;
namespace
{
using angle::AstcDecompressor;
using angle::WorkerThreadPool;
struct AstcDecompressorParams
{
AstcDecompressorParams(uint32_t width, uint32_t height) : width(width), height(height) {}
uint32_t width;
uint32_t height;
};
std::ostream &operator<<(std::ostream &os, const AstcDecompressorParams ¶ms)
{
os << params.width << "x" << params.height;
return os;
}
class AstcDecompressorPerfTest : public ANGLEPerfTest,
public WithParamInterface<AstcDecompressorParams>
{
public:
AstcDecompressorPerfTest();
void step() override;
std::string getName();
AstcDecompressor &mDecompressor;
std::vector<uint8_t> mInput;
std::vector<uint8_t> mOutput;
std::shared_ptr<WorkerThreadPool> mSingleThreadPool;
std::shared_ptr<WorkerThreadPool> mMultiThreadPool;
};
AstcDecompressorPerfTest::AstcDecompressorPerfTest()
: ANGLEPerfTest(getName(), "", "_run", 1, "us"),
mDecompressor(AstcDecompressor::get()),
mInput(makeAstcCheckerboard(GetParam().width, GetParam().height)),
mOutput(GetParam().width * GetParam().height * 4),
mSingleThreadPool(WorkerThreadPool::Create(1, ANGLEPlatformCurrent())),
mMultiThreadPool(WorkerThreadPool::Create(0, ANGLEPlatformCurrent()))
{}
void AstcDecompressorPerfTest::step()
{
mDecompressor.decompress(mSingleThreadPool, mMultiThreadPool, GetParam().width,
GetParam().height, 8, 8, mInput.data(), mInput.size(), mOutput.data());
}
std::string AstcDecompressorPerfTest::getName()
{
std::stringstream ss;
ss << UnitTest::GetInstance()->current_test_case()->name() << "/" << GetParam();
return ss.str();
}
// Measures the speed of ASTC decompression on the CPU.
TEST_P(AstcDecompressorPerfTest, Run)
{
if (!mDecompressor.available())
skipTest("ASTC decompressor not available");
this->run();
}
INSTANTIATE_TEST_SUITE_P(,
AstcDecompressorPerfTest,
Values(AstcDecompressorParams(16, 16),
AstcDecompressorParams(256, 256),
AstcDecompressorParams(1024, 1024)),
PrintToStringParamName());
} // anonymous namespace