Path: blob/main_old/src/tests/perf_tests/VulkanPipelineCachePerf.cpp
1693 views
//1// Copyright 2018 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// VulkanPipelineCachePerf:6// Performance benchmark for the Vulkan Pipeline cache.78#include "ANGLEPerfTest.h"910#include "libANGLE/renderer/vulkan/vk_cache_utils.h"11#include "libANGLE/renderer/vulkan/vk_helpers.h"12#include "util/random_utils.h"1314using namespace rx;1516namespace17{18constexpr unsigned int kIterationsPerStep = 100;1920class VulkanPipelineCachePerfTest : public ANGLEPerfTest21{22public:23VulkanPipelineCachePerfTest();24~VulkanPipelineCachePerfTest();2526void SetUp() override;27void step() override;2829GraphicsPipelineCache mCache;30angle::RNG mRNG;3132std::vector<vk::GraphicsPipelineDesc> mCacheHits;33std::vector<vk::GraphicsPipelineDesc> mCacheMisses;34size_t mMissIndex = 0;3536private:37void randomizeDesc(vk::GraphicsPipelineDesc *desc);38};3940VulkanPipelineCachePerfTest::VulkanPipelineCachePerfTest()41: ANGLEPerfTest("VulkanPipelineCachePerf", "", "", kIterationsPerStep)42{}4344VulkanPipelineCachePerfTest::~VulkanPipelineCachePerfTest()45{46mCache.destroy(VK_NULL_HANDLE);47}4849void VulkanPipelineCachePerfTest::SetUp()50{51// Insert a number of random pipeline states.52for (int pipelineCount = 0; pipelineCount < 100; ++pipelineCount)53{54vk::Pipeline pipeline;55vk::GraphicsPipelineDesc desc;56randomizeDesc(&desc);5758if (pipelineCount < 10)59{60mCacheHits.push_back(desc);61}62mCache.populate(desc, std::move(pipeline));63}6465for (int missCount = 0; missCount < 10000; ++missCount)66{67vk::GraphicsPipelineDesc desc;68randomizeDesc(&desc);69mCacheMisses.push_back(desc);70}71}7273void VulkanPipelineCachePerfTest::randomizeDesc(vk::GraphicsPipelineDesc *desc)74{75std::vector<uint8_t> bytes(sizeof(vk::GraphicsPipelineDesc));76FillVectorWithRandomUBytes(&mRNG, &bytes);77memcpy(desc, bytes.data(), sizeof(vk::GraphicsPipelineDesc));78}7980void VulkanPipelineCachePerfTest::step()81{82vk::RenderPass rp;83vk::PipelineLayout pl;84vk::PipelineCache pc;85vk::ShaderModule sm;86const vk::GraphicsPipelineDesc *desc = nullptr;87vk::PipelineHelper *result = nullptr;88gl::AttributesMask am;89gl::ComponentTypeMask ctm;9091vk::SpecializationConstants defaultSpecConsts{};9293for (unsigned int iteration = 0; iteration < kIterationsPerStep; ++iteration)94{95for (const auto &hit : mCacheHits)96{97(void)mCache.getPipeline(VK_NULL_HANDLE, pc, rp, pl, am, ctm, &sm, &sm, nullptr,98nullptr, nullptr, defaultSpecConsts, hit, &desc, &result);99}100}101102for (int missCount = 0; missCount < 20 && mMissIndex < mCacheMisses.size();103++missCount, ++mMissIndex)104{105const auto &miss = mCacheMisses[mMissIndex];106(void)mCache.getPipeline(VK_NULL_HANDLE, pc, rp, pl, am, ctm, &sm, &sm, nullptr, nullptr,107nullptr, defaultSpecConsts, miss, &desc, &result);108}109}110111} // anonymous namespace112113TEST_F(VulkanPipelineCachePerfTest, Run)114{115run();116}117118119