Edit

kc3-lang/angle/src/tests/perf_tests/VulkanPipelineCachePerf.cpp

Branch :

  • Show log

    Commit

  • Author : Jaedon Lee
    Date : 2019-09-02 14:49:07
    Hash : a0159c03
    Message : Vulkan: Implement basic geometry shader feature Enable the default behavior of the geometry shader Bug: angleproject:3571 Test: dEQP-GLES31.functional.geometry_shading.input.basic_primitive.points dEQP-GLES31.functional.geometry_shading.input.basic_primitive.lines dEQP-GLES31.functional.geometry_shading.input.basic_primitive.line_loop dEQP-GLES31.functional.geometry_shading.input.basic_primitive.line_strip dEQP-GLES31.functional.geometry_shading.input.basic_primitive.triangles dEQP-GLES31.functional.geometry_shading.input.basic_primitive.triangle_strip dEQP-GLES31.functional.geometry_shading.input.basic_primitive.triangle_fan Change-Id: I65708d19bbfe6a0ad8ca392a1d6b3609b1410ef4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1793753 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/tests/perf_tests/VulkanPipelineCachePerf.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.
    //
    // VulkanPipelineCachePerf:
    //   Performance benchmark for the Vulkan Pipeline cache.
    
    #include "ANGLEPerfTest.h"
    
    #include "libANGLE/renderer/vulkan/vk_cache_utils.h"
    #include "util/random_utils.h"
    
    using namespace rx;
    
    namespace
    {
    constexpr unsigned int kIterationsPerStep = 100;
    
    class VulkanPipelineCachePerfTest : public ANGLEPerfTest
    {
      public:
        VulkanPipelineCachePerfTest();
        ~VulkanPipelineCachePerfTest();
    
        void SetUp() override;
        void step() override;
    
        GraphicsPipelineCache mCache;
        angle::RNG mRNG;
    
        std::vector<vk::GraphicsPipelineDesc> mCacheHits;
        std::vector<vk::GraphicsPipelineDesc> mCacheMisses;
        size_t mMissIndex = 0;
    
      private:
        void randomizeDesc(vk::GraphicsPipelineDesc *desc);
    };
    
    VulkanPipelineCachePerfTest::VulkanPipelineCachePerfTest()
        : ANGLEPerfTest("VulkanPipelineCachePerf", "", "", kIterationsPerStep)
    {}
    
    VulkanPipelineCachePerfTest::~VulkanPipelineCachePerfTest()
    {
        mCache.destroy(VK_NULL_HANDLE);
    }
    
    void VulkanPipelineCachePerfTest::SetUp()
    {
        // Insert a number of random pipeline states.
        for (int pipelineCount = 0; pipelineCount < 100; ++pipelineCount)
        {
            vk::Pipeline pipeline;
            vk::GraphicsPipelineDesc desc;
            randomizeDesc(&desc);
    
            if (pipelineCount < 10)
            {
                mCacheHits.push_back(desc);
            }
            mCache.populate(desc, std::move(pipeline));
        }
    
        for (int missCount = 0; missCount < 10000; ++missCount)
        {
            vk::GraphicsPipelineDesc desc;
            randomizeDesc(&desc);
            mCacheMisses.push_back(desc);
        }
    }
    
    void VulkanPipelineCachePerfTest::randomizeDesc(vk::GraphicsPipelineDesc *desc)
    {
        std::vector<uint8_t> bytes(sizeof(vk::GraphicsPipelineDesc));
        FillVectorWithRandomUBytes(&mRNG, &bytes);
        memcpy(desc, bytes.data(), sizeof(vk::GraphicsPipelineDesc));
    }
    
    void VulkanPipelineCachePerfTest::step()
    {
        vk::RenderPass rp;
        vk::PipelineLayout pl;
        vk::PipelineCache pc;
        vk::ShaderModule sm;
        const vk::GraphicsPipelineDesc *desc = nullptr;
        vk::PipelineHelper *result           = nullptr;
        gl::AttributesMask am;
        gl::ComponentTypeMask ctm;
    
        for (unsigned int iteration = 0; iteration < kIterationsPerStep; ++iteration)
        {
            for (const auto &hit : mCacheHits)
            {
                (void)mCache.getPipeline(VK_NULL_HANDLE, pc, rp, pl, am, ctm, &sm, &sm, nullptr, hit,
                                         &desc, &result);
            }
        }
    
        for (int missCount = 0; missCount < 20 && mMissIndex < mCacheMisses.size();
             ++missCount, ++mMissIndex)
        {
            const auto &miss = mCacheMisses[mMissIndex];
            (void)mCache.getPipeline(VK_NULL_HANDLE, pc, rp, pl, am, ctm, &sm, &sm, nullptr, miss,
                                     &desc, &result);
        }
    }
    
    }  // anonymous namespace
    
    TEST_F(VulkanPipelineCachePerfTest, Run)
    {
        run();
    }