blob: 5eada94e234ed0cfb3ecac80df616a710fdd3ead [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gpu/command_buffer/common/shared_image_usage.h"
#include <cstdint>
#include "testing/gtest/include/gtest/gtest.h"
namespace gpu {
TEST(SharedImageUsage, ConstructionFromInitializerList) {
SharedImageUsageSet usage_set = {SHARED_IMAGE_USAGE_GLES2_READ,
SHARED_IMAGE_USAGE_GLES2_WRITE};
EXPECT_TRUE(usage_set.Has(SHARED_IMAGE_USAGE_GLES2_READ));
EXPECT_TRUE(usage_set.Has(SHARED_IMAGE_USAGE_GLES2_WRITE));
}
TEST(SharedImageUsage, FunctionsMemberOperator) {
SharedImageUsageSet as_usage_set = SHARED_IMAGE_USAGE_GLES2_READ;
as_usage_set |= SHARED_IMAGE_USAGE_SCANOUT;
EXPECT_EQ(static_cast<uint32_t>(SHARED_IMAGE_USAGE_GLES2_READ) |
static_cast<uint32_t>(SHARED_IMAGE_USAGE_SCANOUT),
static_cast<uint32_t>(as_usage_set));
}
TEST(SharedImageUsage, FunctionsHasSingleElement) {
SharedImageUsageSet as_usage_set =
SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_DISPLAY_READ;
as_usage_set |= SHARED_IMAGE_USAGE_SCANOUT;
EXPECT_TRUE(as_usage_set.Has(SHARED_IMAGE_USAGE_SCANOUT));
EXPECT_TRUE(as_usage_set.Has(SHARED_IMAGE_USAGE_GLES2_READ));
EXPECT_FALSE(as_usage_set.Has(SHARED_IMAGE_USAGE_WEBGPU_READ));
}
TEST(SharedImageUsage, FunctionsHasAll) {
SharedImageUsageSet as_usage_set =
SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_DISPLAY_READ;
as_usage_set |= SHARED_IMAGE_USAGE_SCANOUT;
EXPECT_TRUE(as_usage_set.HasAll(SHARED_IMAGE_USAGE_DISPLAY_READ |
SHARED_IMAGE_USAGE_SCANOUT));
EXPECT_FALSE(as_usage_set.HasAll(SHARED_IMAGE_USAGE_DISPLAY_READ |
SHARED_IMAGE_USAGE_WEBGPU_READ));
}
TEST(SharedImageUsage, FunctionsHasAny) {
SharedImageUsageSet as_usage_set =
SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_DISPLAY_READ;
as_usage_set |= SHARED_IMAGE_USAGE_SCANOUT;
EXPECT_TRUE(as_usage_set.HasAny(SHARED_IMAGE_USAGE_DISPLAY_READ |
SHARED_IMAGE_USAGE_WEBGPU_READ));
EXPECT_FALSE(as_usage_set.Has(SHARED_IMAGE_USAGE_MIPMAP));
EXPECT_FALSE(as_usage_set.HasAny(SHARED_IMAGE_USAGE_MIPMAP |
SHARED_IMAGE_USAGE_CPU_WRITE_ONLY));
}
TEST(SharedImageUsage, FunctionsIntersect) {
SharedImageUsageSet as_usage_set = SHARED_IMAGE_USAGE_WEBGPU_WRITE |
SHARED_IMAGE_USAGE_RASTER_WRITE |
SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU;
as_usage_set =
Intersection(as_usage_set, SHARED_IMAGE_USAGE_WEBGPU_WRITE |
SHARED_IMAGE_USAGE_RAW_DRAW |
SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU);
EXPECT_EQ(static_cast<uint32_t>(SHARED_IMAGE_USAGE_WEBGPU_WRITE |
SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU),
static_cast<uint32_t>(as_usage_set));
}
TEST(SharedImageUsage, GlobalOperatorCasting) {
// Global operators will create a 'SharedImageUsageSet'.
auto as_usage_set = SHARED_IMAGE_USAGE_GLES2_READ |
SHARED_IMAGE_USAGE_CPU_WRITE_ONLY |
SHARED_IMAGE_USAGE_WEBGPU_READ;
as_usage_set |= as_usage_set | SHARED_IMAGE_USAGE_RAW_DRAW;
as_usage_set |= SHARED_IMAGE_USAGE_RASTER_WRITE | as_usage_set;
EXPECT_TRUE(as_usage_set.HasAll(
SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_CPU_WRITE_ONLY |
SHARED_IMAGE_USAGE_WEBGPU_READ | SHARED_IMAGE_USAGE_RAW_DRAW |
SHARED_IMAGE_USAGE_RASTER_WRITE));
}
TEST(SharedImageUsage, RemoveAll) {
SharedImageUsageSet as_usage_set =
SHARED_IMAGE_USAGE_WEBGPU_WRITE | SHARED_IMAGE_USAGE_RASTER_WRITE |
SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU | SHARED_IMAGE_USAGE_RAW_DRAW;
as_usage_set.RemoveAll(SHARED_IMAGE_USAGE_RASTER_WRITE |
SHARED_IMAGE_USAGE_RAW_DRAW);
EXPECT_TRUE(as_usage_set.HasAll(SHARED_IMAGE_USAGE_WEBGPU_WRITE |
SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU));
EXPECT_FALSE(as_usage_set.HasAny(SHARED_IMAGE_USAGE_RASTER_WRITE |
SHARED_IMAGE_USAGE_RAW_DRAW));
}
TEST(SharedImageUsage, RemoveAllButNotPresent) {
SharedImageUsageSet as_usage_set =
SHARED_IMAGE_USAGE_WEBGPU_WRITE | SHARED_IMAGE_USAGE_RASTER_WRITE |
SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU | SHARED_IMAGE_USAGE_RAW_DRAW;
// We intentionally remove 'SHARED_IMAGE_USAGE_CPU_WRITE_ONLY' even though it
// was never added in above. We are testing that this is allowed and that it
// will not produce an internal bit flip.
as_usage_set.RemoveAll(SHARED_IMAGE_USAGE_RASTER_WRITE |
SHARED_IMAGE_USAGE_CPU_WRITE_ONLY);
EXPECT_TRUE(as_usage_set.HasAll(SHARED_IMAGE_USAGE_WEBGPU_WRITE |
SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU |
SHARED_IMAGE_USAGE_RAW_DRAW));
EXPECT_FALSE(as_usage_set.HasAny(SHARED_IMAGE_USAGE_RASTER_WRITE |
SHARED_IMAGE_USAGE_CPU_WRITE_ONLY));
}
TEST(SharedImageUsage, GlobalOperatorSetUnion) {
// Global operators will create a 'SharedImageUsageSet'.
SharedImageUsageSet usage_a =
SHARED_IMAGE_USAGE_CPU_WRITE_ONLY | SHARED_IMAGE_USAGE_WEBGPU_READ;
SharedImageUsageSet usage_b =
SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU | SHARED_IMAGE_USAGE_RASTER_WRITE;
SharedImageUsageSet usage_set_union = usage_a | usage_b;
EXPECT_TRUE(usage_set_union.HasAll(SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU |
SHARED_IMAGE_USAGE_RASTER_WRITE |
SHARED_IMAGE_USAGE_CPU_WRITE_ONLY |
SHARED_IMAGE_USAGE_WEBGPU_READ));
}
TEST(SharedImageUsage, ImplicitCasting) {
SharedImageUsageSet as_usage_set =
SHARED_IMAGE_USAGE_CPU_WRITE_ONLY | SHARED_IMAGE_USAGE_WEBGPU_READ;
// TODO(crbug.com/343347288): Remove after all usage has been converted to
// `SharedImageUsageSet`.
// Temporary exception to allow for existing, non type safe, conversions.
uint32_t as_uint32_t = as_usage_set;
EXPECT_EQ(static_cast<uint32_t>(SHARED_IMAGE_USAGE_CPU_WRITE_ONLY) |
static_cast<uint32_t>(SHARED_IMAGE_USAGE_WEBGPU_READ),
as_uint32_t);
}
TEST(SharedImageUsage, EqualityTest) {
SharedImageUsageSet usage_a =
SHARED_IMAGE_USAGE_CPU_WRITE_ONLY | SHARED_IMAGE_USAGE_WEBGPU_READ;
SharedImageUsageSet usage_b =
SHARED_IMAGE_USAGE_WEBGPU_READ | SHARED_IMAGE_USAGE_CPU_WRITE_ONLY;
SharedImageUsageSet usage_c = SHARED_IMAGE_USAGE_CPU_WRITE_ONLY;
SharedImageUsageSet usage_d = SHARED_IMAGE_USAGE_CPU_WRITE_ONLY |
SHARED_IMAGE_USAGE_WEBGPU_READ |
SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU;
EXPECT_TRUE(usage_a == usage_b);
EXPECT_FALSE(usage_a == usage_c);
EXPECT_FALSE(usage_a == usage_d);
}
TEST(SharedImageUsage, ExplicitCasting) {
// Explicit creation from raw bits of a uint32_t.
SharedImageUsageSet explicit_constructor_set =
SharedImageUsageSet(uint32_t(0b101));
EXPECT_TRUE(explicit_constructor_set.HasAll(SHARED_IMAGE_USAGE_GLES2_READ |
SHARED_IMAGE_USAGE_DISPLAY_READ));
// This cast will intentionally not compile. Leaving this here as an example.
// SharedImageUsageSet fail_to_compile = uint32_t(0x1);
}
TEST(SharedImageUsage, Combinations) {
// usage_i != 0 ensures we don't overflow past the last valid bit (1u << 31).
for (uint32_t usage_i = 1u;
usage_i != 0 && usage_i <= LAST_SHARED_IMAGE_USAGE; usage_i <<= 1) {
SharedImageUsageSet set_combine_two =
static_cast<SharedImageUsage>(usage_i);
for (uint32_t usage_j = 1u;
usage_j != 0 && usage_j <= LAST_SHARED_IMAGE_USAGE; usage_j <<= 1) {
set_combine_two.PutAll(static_cast<SharedImageUsage>(usage_j));
EXPECT_TRUE(
set_combine_two.HasAll(static_cast<SharedImageUsage>(usage_j) |
static_cast<SharedImageUsage>(usage_i)));
}
}
}
} // namespace gpu