D3D12: Bucket descriptor allocation by powers of two

WebGPU currently allows as many as 108 view descriptors per bind
group. This is too many to have one descriptor allocator per size,
so we need to bucket them by size.

Bug: dawn:443, dawn:488
Change-Id: I4fc8cf7cd0dc8292bb6a8488fd2ceb7575e1e5f7
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/24787
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Bryan Bernhart <bryan.bernhart@intel.com>
Commit-Queue: Austin Eng <enga@chromium.org>
This commit is contained in:
Austin Eng
2020-07-17 01:11:16 +00:00
committed by Commit Bot service account
parent e8e089ad28
commit cb2938a1af
4 changed files with 86 additions and 17 deletions

View File

@@ -37,14 +37,61 @@ TEST(Math, Log2) {
ASSERT_EQ(Log2(0xFFFFFFFFu), 31u);
ASSERT_EQ(Log2(static_cast<uint64_t>(0xFFFFFFFFFFFFFFFF)), 63u);
static_assert(ConstexprLog2(1u) == 0u, "");
static_assert(ConstexprLog2(0xFFFFFFFFu) == 31u, "");
static_assert(ConstexprLog2(static_cast<uint64_t>(0xFFFFFFFFFFFFFFFF)) == 63u, "");
// Test boundary between two logs
ASSERT_EQ(Log2(0x80000000u), 31u);
ASSERT_EQ(Log2(0x7FFFFFFFu), 30u);
ASSERT_EQ(Log2(static_cast<uint64_t>(0x8000000000000000)), 63u);
ASSERT_EQ(Log2(static_cast<uint64_t>(0x7FFFFFFFFFFFFFFF)), 62u);
static_assert(ConstexprLog2(0x80000000u) == 31u, "");
static_assert(ConstexprLog2(0x7FFFFFFFu) == 30u, "");
static_assert(ConstexprLog2(static_cast<uint64_t>(0x8000000000000000)) == 63u, "");
static_assert(ConstexprLog2(static_cast<uint64_t>(0x7FFFFFFFFFFFFFFF)) == 62u, "");
ASSERT_EQ(Log2(16u), 4u);
ASSERT_EQ(Log2(15u), 3u);
static_assert(ConstexprLog2(16u) == 4u, "");
static_assert(ConstexprLog2(15u) == 3u, "");
}
// Tests for Log2Ceil
TEST(Math, Log2Ceil) {
// Test extrema
ASSERT_EQ(Log2Ceil(1u), 0u);
ASSERT_EQ(Log2Ceil(0xFFFFFFFFu), 32u);
ASSERT_EQ(Log2Ceil(static_cast<uint64_t>(0xFFFFFFFFFFFFFFFF)), 64u);
static_assert(ConstexprLog2Ceil(1u) == 0u, "");
static_assert(ConstexprLog2Ceil(0xFFFFFFFFu) == 32u, "");
static_assert(ConstexprLog2Ceil(static_cast<uint64_t>(0xFFFFFFFFFFFFFFFF)) == 64u, "");
// Test boundary between two logs
ASSERT_EQ(Log2Ceil(0x80000001u), 32u);
ASSERT_EQ(Log2Ceil(0x80000000u), 31u);
ASSERT_EQ(Log2Ceil(0x7FFFFFFFu), 31u);
ASSERT_EQ(Log2Ceil(static_cast<uint64_t>(0x8000000000000001)), 64u);
ASSERT_EQ(Log2Ceil(static_cast<uint64_t>(0x8000000000000000)), 63u);
ASSERT_EQ(Log2Ceil(static_cast<uint64_t>(0x7FFFFFFFFFFFFFFF)), 63u);
static_assert(ConstexprLog2Ceil(0x80000001u) == 32u, "");
static_assert(ConstexprLog2Ceil(0x80000000u) == 31u, "");
static_assert(ConstexprLog2Ceil(0x7FFFFFFFu) == 31u, "");
static_assert(ConstexprLog2Ceil(static_cast<uint64_t>(0x8000000000000001)) == 64u, "");
static_assert(ConstexprLog2Ceil(static_cast<uint64_t>(0x8000000000000000)) == 63u, "");
static_assert(ConstexprLog2Ceil(static_cast<uint64_t>(0x7FFFFFFFFFFFFFFF)) == 63u, "");
ASSERT_EQ(Log2Ceil(17u), 5u);
ASSERT_EQ(Log2Ceil(16u), 4u);
ASSERT_EQ(Log2Ceil(15u), 4u);
static_assert(ConstexprLog2Ceil(17u) == 5u, "");
static_assert(ConstexprLog2Ceil(16u) == 4u, "");
static_assert(ConstexprLog2Ceil(15u) == 4u, "");
}
// Tests for IsPowerOfTwo