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
//
// 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.
//
// AstcDecompressor_unittest.cpp: Unit tests for AstcDecompressor
#include <gmock/gmock.h>
#include <vector>
#include "common/WorkerThread.h"
#include "image_util/AstcDecompressor.h"
#include "image_util/AstcDecompressorTestUtils.h"
using namespace angle;
using namespace testing;
namespace
{
// Test that we can correctly decompress an image
TEST(AstcDecompressor, Decompress)
{
const int width = 1024;
const int height = 1024;
auto singleThreadedPool = WorkerThreadPool::Create(1, ANGLEPlatformCurrent());
auto multiThreadedPool = WorkerThreadPool::Create(0, ANGLEPlatformCurrent());
auto &decompressor = AstcDecompressor::get();
if (!decompressor.available())
GTEST_SKIP() << "ASTC decompressor not available";
std::vector<Rgba> output(width * height);
std::vector<uint8_t> astcData = makeAstcCheckerboard(width, height);
int32_t status =
decompressor.decompress(singleThreadedPool, multiThreadedPool, width, height, 8, 8,
astcData.data(), astcData.size(), (uint8_t *)output.data());
EXPECT_EQ(status, 0);
std::vector<Rgba> expected = makeCheckerboard(width, height);
ASSERT_THAT(output, ElementsAreArray(expected));
}
// Test that getStatusString returns non-null even for unknown statuses
TEST(AstcDecompressor, getStatusStringAlwaysNonNull)
{
EXPECT_THAT(AstcDecompressor::get().getStatusString(-10000), NotNull());
}
} // namespace