Edit

kc3-lang/angle/src/common/FastVector_unittest.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2020-08-02 16:29:35
    Hash : d201ed8b
    Message : Vulkan: Track used Images in RenderPass. Adding a simple ImageSerial tracking map in our RenderPass allows us to know when we do or do not need to close the RenderPass on a new Image access. This simple tracking scheme improves Manhattan performance by up to 25% on Android. The improved perf comes from reducing our RenderPass count (23->18 RenderPasses in our capture scene). Adds a FastUnorderedSet class to manage the used RP Image serials. Updates the Query helpers to explicitly flush the RP before inserting queries. Bug: angleproject:4911 Change-Id: I0c34fc8e307514ebdf3e81e08d8e5aedb70ebe8f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2334346 Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • src/common/FastVector_unittest.cpp
  • //
    // Copyright 2018 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.
    //
    // FixedVector_unittest:
    //   Tests of the FastVector class
    //
    
    #include <gtest/gtest.h>
    
    #include "common/FastVector.h"
    
    namespace angle
    {
    // Make sure the various constructors compile and do basic checks
    TEST(FastVector, Constructors)
    {
        FastVector<int, 5> defaultContructor;
        EXPECT_EQ(0u, defaultContructor.size());
    
        FastVector<int, 5> count(3);
        EXPECT_EQ(3u, count.size());
    
        FastVector<int, 5> countAndValue(3, 2);
        EXPECT_EQ(3u, countAndValue.size());
        EXPECT_EQ(2, countAndValue[1]);
    
        FastVector<int, 5> copy(countAndValue);
        EXPECT_EQ(copy, countAndValue);
    
        FastVector<int, 5> copyRValue(std::move(count));
        EXPECT_EQ(3u, copyRValue.size());
    
        FastVector<int, 5> initializerList{1, 2, 3, 4, 5};
        EXPECT_EQ(5u, initializerList.size());
        EXPECT_EQ(3, initializerList[2]);
    
        FastVector<int, 5> assignCopy(copyRValue);
        EXPECT_EQ(3u, assignCopy.size());
    
        FastVector<int, 5> assignRValue(std::move(assignCopy));
        EXPECT_EQ(3u, assignRValue.size());
    
        FastVector<int, 5> assignmentInitializerList = {1, 2, 3, 4, 5};
        EXPECT_EQ(5u, assignmentInitializerList.size());
        EXPECT_EQ(3, assignmentInitializerList[2]);
    }
    
    // Test indexing operations (at, operator[])
    TEST(FastVector, Indexing)
    {
        FastVector<int, 5> vec = {0, 1, 2, 3, 4};
        for (int i = 0; i < 5; ++i)
        {
            EXPECT_EQ(i, vec.at(i));
            EXPECT_EQ(vec[i], vec.at(i));
        }
    }
    
    // Test the push_back functions
    TEST(FastVector, PushBack)
    {
        FastVector<int, 5> vec;
        vec.push_back(1);
        EXPECT_EQ(1, vec[0]);
        vec.push_back(1);
        vec.push_back(1);
        vec.push_back(1);
        vec.push_back(1);
        EXPECT_EQ(5u, vec.size());
    }
    
    // Tests growing the fast vector beyond the fixed storage.
    TEST(FastVector, Growth)
    {
        constexpr size_t kSize = 4;
        FastVector<size_t, kSize> vec;
    
        for (size_t i = 0; i < kSize * 2; ++i)
        {
            vec.push_back(i);
        }
    
        EXPECT_EQ(kSize * 2, vec.size());
    
        for (size_t i = kSize * 2; i > 0; --i)
        {
            ASSERT_EQ(vec.back(), i - 1);
            vec.pop_back();
        }
    
        EXPECT_EQ(0u, vec.size());
    }
    
    // Test the pop_back function
    TEST(FastVector, PopBack)
    {
        FastVector<int, 5> vec;
        vec.push_back(1);
        EXPECT_EQ(1, (int)vec.size());
        vec.pop_back();
        EXPECT_EQ(0, (int)vec.size());
    }
    
    // Test the back function
    TEST(FastVector, Back)
    {
        FastVector<int, 5> vec;
        vec.push_back(1);
        vec.push_back(2);
        EXPECT_EQ(2, vec.back());
    }
    
    // Test the back function
    TEST(FastVector, Front)
    {
        FastVector<int, 5> vec;
        vec.push_back(1);
        vec.push_back(2);
        EXPECT_EQ(1, vec.front());
    }
    
    // Test the sizing operations
    TEST(FastVector, Size)
    {
        FastVector<int, 5> vec;
        EXPECT_TRUE(vec.empty());
        EXPECT_EQ(0u, vec.size());
    
        vec.push_back(1);
        EXPECT_FALSE(vec.empty());
        EXPECT_EQ(1u, vec.size());
    }
    
    // Test clearing the vector
    TEST(FastVector, Clear)
    {
        FastVector<int, 5> vec = {0, 1, 2, 3, 4};
        vec.clear();
        EXPECT_TRUE(vec.empty());
    }
    
    // Test clearing the vector larger than the fixed size.
    TEST(FastVector, ClearWithLargerThanFixedSize)
    {
        FastVector<int, 3> vec = {0, 1, 2, 3, 4};
        vec.clear();
        EXPECT_TRUE(vec.empty());
    }
    
    // Test resizing the vector
    TEST(FastVector, Resize)
    {
        FastVector<int, 5> vec;
        vec.resize(5u, 1);
        EXPECT_EQ(5u, vec.size());
        for (int i : vec)
        {
            EXPECT_EQ(1, i);
        }
    
        vec.resize(2u);
        EXPECT_EQ(2u, vec.size());
        for (int i : vec)
        {
            EXPECT_EQ(1, i);
        }
    
        // Resize to larger than minimum
        vec.resize(10u, 2);
        EXPECT_EQ(10u, vec.size());
    
        for (size_t index = 0; index < 2u; ++index)
        {
            EXPECT_EQ(1, vec[index]);
        }
        for (size_t index = 2u; index < 10u; ++index)
        {
            EXPECT_EQ(2, vec[index]);
        }
    
        // Resize back to smaller
        vec.resize(2u, 2);
        EXPECT_EQ(2u, vec.size());
    }
    
    // Test iterating over the vector
    TEST(FastVector, Iteration)
    {
        FastVector<int, 5> vec = {0, 1, 2, 3};
    
        int vistedCount = 0;
        for (int value : vec)
        {
            EXPECT_EQ(vistedCount, value);
            vistedCount++;
        }
        EXPECT_EQ(4, vistedCount);
    }
    
    // Tests that equality comparisons work even if reserved size differs.
    TEST(FastVector, EqualityWithDifferentReservedSizes)
    {
        FastVector<int, 3> vec1 = {1, 2, 3, 4, 5};
        FastVector<int, 5> vec2 = {1, 2, 3, 4, 5};
        EXPECT_EQ(vec1, vec2);
        vec2.push_back(6);
        EXPECT_NE(vec1, vec2);
    }
    
    // Tests vector operations with a non copyable type.
    TEST(FastVector, NonCopyable)
    {
        struct s : angle::NonCopyable
        {
            s() : x(0) {}
            s(int xin) : x(xin) {}
            s(s &&other) : x(other.x) {}
            s &operator=(s &&other)
            {
                x = other.x;
                return *this;
            }
            int x;
        };
    
        FastVector<s, 3> vec;
        vec.push_back(3);
        EXPECT_EQ(3, vec[0].x);
    
        FastVector<s, 3> copy = std::move(vec);
        EXPECT_EQ(1u, copy.size());
        EXPECT_EQ(3, copy[0].x);
    }
    
    // Basic functionality for FastUnorderedMap
    TEST(FastUnorderedMap, BasicUsage)
    {
        FastUnorderedMap<int, bool, 3> testMap;
        EXPECT_TRUE(testMap.empty());
    
        testMap.insert(5, true);
        EXPECT_TRUE(testMap.contains(5));
    
        bool value = false;
        EXPECT_TRUE(testMap.get(5, &value));
        EXPECT_TRUE(value);
        EXPECT_FALSE(testMap.get(6, &value));
    
        EXPECT_FALSE(testMap.empty());
        testMap.clear();
        EXPECT_TRUE(testMap.empty());
    
        for (int i = 0; i < 10; ++i)
        {
            testMap.insert(i, false);
        }
    
        for (int i = 0; i < 10; ++i)
        {
            EXPECT_TRUE(testMap.contains(i));
            EXPECT_TRUE(testMap.get(i, &value));
            EXPECT_FALSE(value);
        }
    }
    
    // Basic functionality for FastUnorderedSet
    TEST(FastUnorderedSet, BasicUsage)
    {
        FastUnorderedSet<int, 3> testMap;
        EXPECT_TRUE(testMap.empty());
    
        testMap.insert(5);
        EXPECT_TRUE(testMap.contains(5));
        EXPECT_FALSE(testMap.contains(6));
        EXPECT_FALSE(testMap.empty());
    
        testMap.clear();
        EXPECT_TRUE(testMap.empty());
    
        for (int i = 0; i < 10; ++i)
        {
            testMap.insert(i);
        }
    
        for (int i = 0; i < 10; ++i)
        {
            EXPECT_TRUE(testMap.contains(i));
        }
    }
    }  // namespace angle