Path: blob/main_old/src/tests/perf_tests/VulkanCommandBufferPerf.cpp
1693 views
// Copyright 2018 The ANGLE Project Authors. All rights reserved.1// Use of this source code is governed by a BSD-style license that can be2// found in the LICENSE file.3//4// VulkanCommandBufferPerf:5// Performance benchmark for Vulkan Primary/Secondary Command Buffer implementations.6// Can run just these tests by adding "--gtest_filter=VulkanCommandBufferPerfTest*"7// option to angle_white_box_perftests.8// When running on Android with run_angle_white_box_perftests, use "-v" option.910#include "ANGLEPerfTest.h"11#include "common/platform.h"12#include "test_utils/third_party/vulkan_command_buffer_utils.h"1314#if defined(ANDROID)15# define NUM_CMD_BUFFERS 100016// Android devices tend to be slower so only do 10 frames to avoid timeout17# define NUM_FRAMES 1018#else19# define NUM_CMD_BUFFERS 100020# define NUM_FRAMES 10021#endif2223// These are minimal shaders used to submit trivial draw commands to command24// buffers so that we can create large batches of cmd buffers with consistent25// draw patterns but size/type of cmd buffers can be varied to test cmd buffer26// differences across devices.27constexpr char kVertShaderText[] = R"(28#version 40029#extension GL_ARB_separate_shader_objects : enable30#extension GL_ARB_shading_language_420pack : enable31layout (std140, binding = 0) uniform bufferVals {32mat4 mvp;33} myBufferVals;34layout (location = 0) in vec4 pos;35layout (location = 1) in vec4 inColor;36layout (location = 0) out vec4 outColor;37void main() {38outColor = inColor;39gl_Position = myBufferVals.mvp * pos;40})";4142constexpr char kFragShaderText[] = R"(43#version 40044#extension GL_ARB_separate_shader_objects : enable45#extension GL_ARB_shading_language_420pack : enable46layout (location = 0) in vec4 color;47layout (location = 0) out vec4 outColor;48void main() {49outColor = color;50})";5152using CommandBufferImpl = void (*)(sample_info &info,53VkClearValue *clear_values,54VkFence drawFence,55VkSemaphore imageAcquiredSemaphore,56int numBuffers);5758struct CommandBufferTestParams59{60CommandBufferImpl CBImplementation;61std::string story;62int frames = NUM_FRAMES;63int buffers = NUM_CMD_BUFFERS;64};6566class VulkanCommandBufferPerfTest : public ANGLEPerfTest,67public ::testing::WithParamInterface<CommandBufferTestParams>68{69public:70VulkanCommandBufferPerfTest();7172void SetUp() override;73void TearDown() override;74void step() override;7576private:77VkClearValue mClearValues[2] = {};78VkSemaphore mImageAcquiredSemaphore = VK_NULL_HANDLE;79VkFence mDrawFence = VK_NULL_HANDLE;8081VkResult res = VK_NOT_READY;82const bool mDepthPresent = true;83struct sample_info mInfo = {};84std::string mSampleTitle;85CommandBufferImpl mCBImplementation = nullptr;86int mFrames = 0;87int mBuffers = 0;88};8990VulkanCommandBufferPerfTest::VulkanCommandBufferPerfTest()91: ANGLEPerfTest("VulkanCommandBufferPerfTest", "", GetParam().story, GetParam().frames)92{93mInfo = {};94mSampleTitle = "Draw Textured Cube";95mCBImplementation = GetParam().CBImplementation;96mFrames = GetParam().frames;97mBuffers = GetParam().buffers;9899// This test appears to be flaky on multiple platforms.100#if !defined(ANGLE_PLATFORM_ANDROID)101// mSkipTest = true;102#endif // !defined(ANGLE_PLATFORM_ANDROID)103}104105void VulkanCommandBufferPerfTest::SetUp()106{107if (mSkipTest)108{109return;110}111112init_global_layer_properties(mInfo);113init_instance_extension_names(mInfo);114init_device_extension_names(mInfo);115init_instance(mInfo, mSampleTitle.c_str());116init_enumerate_device(mInfo);117init_window_size(mInfo, 500, 500);118init_connection(mInfo);119init_window(mInfo);120init_swapchain_extension(mInfo);121init_device(mInfo);122123init_command_pool(mInfo, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);124init_command_buffer(mInfo); // Primary command buffer to hold secondaries125init_command_buffer_array(mInfo, mBuffers); // Array of primary command buffers126init_command_buffer2_array(mInfo, mBuffers); // Array containing all secondary buffers127init_device_queue(mInfo);128init_swap_chain(mInfo);129init_depth_buffer(mInfo);130init_uniform_buffer(mInfo);131init_descriptor_and_pipeline_layouts(mInfo, false);132init_renderpass(mInfo, mDepthPresent);133init_shaders(mInfo, kVertShaderText, kFragShaderText);134init_framebuffers(mInfo, mDepthPresent);135init_vertex_buffer(mInfo, g_vb_solid_face_colors_Data, sizeof(g_vb_solid_face_colors_Data),136sizeof(g_vb_solid_face_colors_Data[0]), false);137init_descriptor_pool(mInfo, false);138init_descriptor_set(mInfo);139init_pipeline_cache(mInfo);140init_pipeline(mInfo, mDepthPresent);141142mClearValues[0].color.float32[0] = 0.2f;143mClearValues[0].color.float32[1] = 0.2f;144mClearValues[0].color.float32[2] = 0.2f;145mClearValues[0].color.float32[3] = 0.2f;146mClearValues[1].depthStencil.depth = 1.0f;147mClearValues[1].depthStencil.stencil = 0;148149VkSemaphoreCreateInfo imageAcquiredSemaphoreCreateInfo;150imageAcquiredSemaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;151imageAcquiredSemaphoreCreateInfo.pNext = NULL;152imageAcquiredSemaphoreCreateInfo.flags = 0;153res = vkCreateSemaphore(mInfo.device, &imageAcquiredSemaphoreCreateInfo, NULL,154&mImageAcquiredSemaphore);155ASSERT_EQ(VK_SUCCESS, res);156157VkFenceCreateInfo fenceInfo;158fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;159fenceInfo.pNext = NULL;160fenceInfo.flags = 0;161res = vkCreateFence(mInfo.device, &fenceInfo, NULL, &mDrawFence);162ASSERT_EQ(VK_SUCCESS, res);163}164165void VulkanCommandBufferPerfTest::step()166{167for (int x = 0; x < mFrames; x++)168{169mInfo.current_buffer = x % mInfo.swapchainImageCount;170171// Get the index of the next available swapchain image:172res = vkAcquireNextImageKHR(mInfo.device, mInfo.swap_chain, UINT64_MAX,173mImageAcquiredSemaphore, VK_NULL_HANDLE, &mInfo.current_buffer);174// Deal with the VK_SUBOPTIMAL_KHR and VK_ERROR_OUT_OF_DATE_KHR175// return codes176ASSERT_EQ(VK_SUCCESS, res);177mCBImplementation(mInfo, mClearValues, mDrawFence, mImageAcquiredSemaphore, mBuffers);178}179}180181void VulkanCommandBufferPerfTest::TearDown()182{183if (mSkipTest)184{185return;186}187188vkDestroySemaphore(mInfo.device, mImageAcquiredSemaphore, NULL);189vkDestroyFence(mInfo.device, mDrawFence, NULL);190destroy_pipeline(mInfo);191destroy_pipeline_cache(mInfo);192destroy_descriptor_pool(mInfo);193destroy_vertex_buffer(mInfo);194destroy_framebuffers(mInfo);195destroy_shaders(mInfo);196destroy_renderpass(mInfo);197destroy_descriptor_and_pipeline_layouts(mInfo);198destroy_uniform_buffer(mInfo);199destroy_depth_buffer(mInfo);200destroy_swap_chain(mInfo);201destroy_command_buffer2_array(mInfo, mBuffers);202destroy_command_buffer_array(mInfo, mBuffers);203destroy_command_buffer(mInfo);204destroy_command_pool(mInfo);205destroy_device(mInfo);206destroy_window(mInfo);207destroy_instance(mInfo);208ANGLEPerfTest::TearDown();209}210211// Common code to present image used by all tests212void Present(sample_info &info, VkFence drawFence)213{214// Now present the image in the window215216VkPresentInfoKHR present;217present.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;218present.pNext = NULL;219present.swapchainCount = 1;220present.pSwapchains = &info.swap_chain;221present.pImageIndices = &info.current_buffer;222present.pWaitSemaphores = NULL;223present.waitSemaphoreCount = 0;224present.pResults = NULL;225226// Make sure command buffer is finished before presenting227VkResult res;228do229{230res = vkWaitForFences(info.device, 1, &drawFence, VK_TRUE, FENCE_TIMEOUT);231} while (res == VK_TIMEOUT);232vkResetFences(info.device, 1, &drawFence);233234ASSERT_EQ(VK_SUCCESS, res);235res = vkQueuePresentKHR(info.present_queue, &present);236ASSERT_EQ(VK_SUCCESS, res);237}238239// 100 separate primary cmd buffers, each with 1 Draw240void PrimaryCommandBufferBenchmarkHundredIndividual(sample_info &info,241VkClearValue *clear_values,242VkFence drawFence,243VkSemaphore imageAcquiredSemaphore,244int numBuffers)245{246VkResult res;247248VkRenderPassBeginInfo rpBegin;249rpBegin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;250rpBegin.pNext = NULL;251rpBegin.renderPass = info.render_pass;252rpBegin.framebuffer = info.framebuffers[info.current_buffer];253rpBegin.renderArea.offset.x = 0;254rpBegin.renderArea.offset.y = 0;255rpBegin.renderArea.extent.width = info.width;256rpBegin.renderArea.extent.height = info.height;257rpBegin.clearValueCount = 2;258rpBegin.pClearValues = clear_values;259260VkCommandBufferBeginInfo cmdBufferInfo = {};261cmdBufferInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;262cmdBufferInfo.pNext = NULL;263cmdBufferInfo.flags = 0;264cmdBufferInfo.pInheritanceInfo = NULL;265266for (int x = 0; x < numBuffers; x++)267{268vkBeginCommandBuffer(info.cmds[x], &cmdBufferInfo);269vkCmdBeginRenderPass(info.cmds[x], &rpBegin, VK_SUBPASS_CONTENTS_INLINE);270vkCmdBindPipeline(info.cmds[x], VK_PIPELINE_BIND_POINT_GRAPHICS, info.pipeline);271vkCmdBindDescriptorSets(info.cmds[x], VK_PIPELINE_BIND_POINT_GRAPHICS, info.pipeline_layout,2720, NUM_DESCRIPTOR_SETS, info.desc_set.data(), 0, NULL);273274const VkDeviceSize offsets[1] = {0};275vkCmdBindVertexBuffers(info.cmds[x], 0, 1, &info.vertex_buffer.buf, offsets);276277init_viewports_array(info, x);278init_scissors_array(info, x);279280vkCmdDraw(info.cmds[x], 0, 1, 0, 0);281vkCmdEndRenderPass(info.cmds[x]);282res = vkEndCommandBuffer(info.cmds[x]);283ASSERT_EQ(VK_SUCCESS, res);284}285286VkPipelineStageFlags pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;287VkSubmitInfo submitInfo[1] = {};288submitInfo[0].pNext = NULL;289submitInfo[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;290submitInfo[0].waitSemaphoreCount = 1;291submitInfo[0].pWaitSemaphores = &imageAcquiredSemaphore;292submitInfo[0].pWaitDstStageMask = &pipe_stage_flags;293submitInfo[0].commandBufferCount = numBuffers;294submitInfo[0].pCommandBuffers = info.cmds.data();295submitInfo[0].signalSemaphoreCount = 0;296submitInfo[0].pSignalSemaphores = NULL;297298// Queue the command buffer for execution299res = vkQueueSubmit(info.graphics_queue, 1, submitInfo, drawFence);300ASSERT_EQ(VK_SUCCESS, res);301302Present(info, drawFence);303}304305// 100 of the same Draw cmds in the same primary cmd buffer306void PrimaryCommandBufferBenchmarkOneWithOneHundred(sample_info &info,307VkClearValue *clear_values,308VkFence drawFence,309VkSemaphore imageAcquiredSemaphore,310int numBuffers)311{312VkResult res;313314VkRenderPassBeginInfo rpBegin;315rpBegin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;316rpBegin.pNext = NULL;317rpBegin.renderPass = info.render_pass;318rpBegin.framebuffer = info.framebuffers[info.current_buffer];319rpBegin.renderArea.offset.x = 0;320rpBegin.renderArea.offset.y = 0;321rpBegin.renderArea.extent.width = info.width;322rpBegin.renderArea.extent.height = info.height;323rpBegin.clearValueCount = 2;324rpBegin.pClearValues = clear_values;325326VkCommandBufferBeginInfo cmdBufferInfo = {};327cmdBufferInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;328cmdBufferInfo.pNext = NULL;329cmdBufferInfo.flags = 0;330cmdBufferInfo.pInheritanceInfo = NULL;331332vkBeginCommandBuffer(info.cmd, &cmdBufferInfo);333for (int x = 0; x < numBuffers; x++)334{335vkCmdBeginRenderPass(info.cmd, &rpBegin, VK_SUBPASS_CONTENTS_INLINE);336vkCmdBindPipeline(info.cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, info.pipeline);337vkCmdBindDescriptorSets(info.cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, info.pipeline_layout, 0,338NUM_DESCRIPTOR_SETS, info.desc_set.data(), 0, NULL);339340const VkDeviceSize offsets[1] = {0};341vkCmdBindVertexBuffers(info.cmd, 0, 1, &info.vertex_buffer.buf, offsets);342343init_viewports(info);344init_scissors(info);345346vkCmdDraw(info.cmd, 0, 1, 0, 0);347vkCmdEndRenderPass(info.cmd);348}349res = vkEndCommandBuffer(info.cmd);350ASSERT_EQ(VK_SUCCESS, res);351352const VkCommandBuffer cmd_bufs[] = {info.cmd};353VkPipelineStageFlags pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;354VkSubmitInfo submitInfo[1] = {};355submitInfo[0].pNext = NULL;356submitInfo[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;357submitInfo[0].waitSemaphoreCount = 1;358submitInfo[0].pWaitSemaphores = &imageAcquiredSemaphore;359submitInfo[0].pWaitDstStageMask = &pipe_stage_flags;360submitInfo[0].commandBufferCount = 1;361submitInfo[0].pCommandBuffers = cmd_bufs;362submitInfo[0].signalSemaphoreCount = 0;363submitInfo[0].pSignalSemaphores = NULL;364365// Queue the command buffer for execution366res = vkQueueSubmit(info.graphics_queue, 1, submitInfo, drawFence);367ASSERT_EQ(VK_SUCCESS, res);368369Present(info, drawFence);370}371372// 100 separate secondary cmd buffers, each with 1 Draw373void SecondaryCommandBufferBenchmark(sample_info &info,374VkClearValue *clear_values,375VkFence drawFence,376VkSemaphore imageAcquiredSemaphore,377int numBuffers)378{379VkResult res;380381// Record Secondary Command Buffer382VkCommandBufferInheritanceInfo inheritInfo = {};383inheritInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;384inheritInfo.pNext = NULL;385inheritInfo.renderPass = info.render_pass;386inheritInfo.subpass = 0;387inheritInfo.framebuffer = info.framebuffers[info.current_buffer];388inheritInfo.occlusionQueryEnable = false;389inheritInfo.queryFlags = 0;390inheritInfo.pipelineStatistics = 0;391392VkCommandBufferBeginInfo secondaryCommandBufferInfo = {};393secondaryCommandBufferInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;394secondaryCommandBufferInfo.pNext = NULL;395secondaryCommandBufferInfo.flags = VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |396VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;397secondaryCommandBufferInfo.pInheritanceInfo = &inheritInfo;398399for (int x = 0; x < numBuffers; x++)400{401vkBeginCommandBuffer(info.cmd2s[x], &secondaryCommandBufferInfo);402vkCmdBindPipeline(info.cmd2s[x], VK_PIPELINE_BIND_POINT_GRAPHICS, info.pipeline);403vkCmdBindDescriptorSets(info.cmd2s[x], VK_PIPELINE_BIND_POINT_GRAPHICS,404info.pipeline_layout, 0, NUM_DESCRIPTOR_SETS, info.desc_set.data(),4050, NULL);406const VkDeviceSize offsets[1] = {0};407vkCmdBindVertexBuffers(info.cmd2s[x], 0, 1, &info.vertex_buffer.buf, offsets);408init_viewports2_array(info, x);409init_scissors2_array(info, x);410vkCmdDraw(info.cmd2s[x], 0, 1, 0, 0);411vkEndCommandBuffer(info.cmd2s[x]);412}413// Record Secondary Command Buffer End414415// Record Primary Command Buffer Begin416VkRenderPassBeginInfo rpBegin;417rpBegin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;418rpBegin.pNext = NULL;419rpBegin.renderPass = info.render_pass;420rpBegin.framebuffer = info.framebuffers[info.current_buffer];421rpBegin.renderArea.offset.x = 0;422rpBegin.renderArea.offset.y = 0;423rpBegin.renderArea.extent.width = info.width;424rpBegin.renderArea.extent.height = info.height;425rpBegin.clearValueCount = 2;426rpBegin.pClearValues = clear_values;427428VkCommandBufferBeginInfo primaryCommandBufferInfo = {};429primaryCommandBufferInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;430primaryCommandBufferInfo.pNext = NULL;431primaryCommandBufferInfo.flags = 0;432primaryCommandBufferInfo.pInheritanceInfo = NULL;433434vkBeginCommandBuffer(info.cmd, &primaryCommandBufferInfo);435for (int x = 0; x < numBuffers; x++)436{437vkCmdBeginRenderPass(info.cmd, &rpBegin, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);438vkCmdExecuteCommands(info.cmd, 1, &info.cmd2s[x]);439vkCmdEndRenderPass(info.cmd);440}441vkEndCommandBuffer(info.cmd);442// Record Primary Command Buffer End443444const VkCommandBuffer cmd_bufs[] = {info.cmd};445VkPipelineStageFlags pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;446VkSubmitInfo submitInfo[1] = {};447submitInfo[0].pNext = NULL;448submitInfo[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;449submitInfo[0].waitSemaphoreCount = 1;450submitInfo[0].pWaitSemaphores = &imageAcquiredSemaphore;451submitInfo[0].pWaitDstStageMask = &pipe_stage_flags;452submitInfo[0].commandBufferCount = 1;453submitInfo[0].pCommandBuffers = cmd_bufs;454submitInfo[0].signalSemaphoreCount = 0;455submitInfo[0].pSignalSemaphores = NULL;456457// Queue the command buffer for execution458res = vkQueueSubmit(info.graphics_queue, 1, submitInfo, drawFence);459ASSERT_EQ(VK_SUCCESS, res);460461Present(info, drawFence);462}463464// Details on the following functions that stress various cmd buffer reset methods.465// All of these functions wrap the SecondaryCommandBufferBenchmark() test above,466// adding additional overhead with various reset methods.467// -CommandPoolDestroyBenchmark: Reset command buffers by destroying and re-creating468// command buffer pool.469// -CommandPoolHardResetBenchmark: Reset the command pool w/ the RELEASE_RESOURCES470// bit set.471// -CommandPoolSoftResetBenchmark: Reset to command pool w/o the RELEASE_RESOURCES472// bit set.473// -CommandBufferExplicitHardResetBenchmark: Reset each individual command buffer474// w/ the RELEASE_RESOURCES bit set.475// -CommandBufferExplicitSoftResetBenchmark: Reset each individual command buffer476// w/o the RELEASE_RESOURCES bit set.477// -CommandBufferImplicitResetBenchmark: Reset each individual command buffer478// implicitly by calling "Begin" on previously used cmd buffer.479480void CommandPoolDestroyBenchmark(sample_info &info,481VkClearValue *clear_values,482VkFence drawFence,483VkSemaphore imageAcquiredSemaphore,484int numBuffers)485{486// Save setup cmd buffer data to be restored487auto saved_cmd_pool = info.cmd_pool;488auto saved_cb = info.cmd;489auto saved_cb2s = info.cmd2s;490// Now re-allocate & destroy cmd buffers to stress those calls491init_command_pool(info, 0);492init_command_buffer2_array(info, numBuffers);493494SecondaryCommandBufferBenchmark(info, clear_values, drawFence, imageAcquiredSemaphore,495numBuffers);496497destroy_command_pool(info);498499// Restore original cmd buffer data for cleanup500info.cmd_pool = saved_cmd_pool;501info.cmd = saved_cb;502info.cmd2s = saved_cb2s;503}504505void CommandPoolHardResetBenchmark(sample_info &info,506VkClearValue *clear_values,507VkFence drawFence,508VkSemaphore imageAcquiredSemaphore,509int numBuffers)510{511SecondaryCommandBufferBenchmark(info, clear_values, drawFence, imageAcquiredSemaphore,512numBuffers);513reset_command_pool(info, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);514}515516void CommandPoolSoftResetBenchmark(sample_info &info,517VkClearValue *clear_values,518VkFence drawFence,519VkSemaphore imageAcquiredSemaphore,520int numBuffers)521{522SecondaryCommandBufferBenchmark(info, clear_values, drawFence, imageAcquiredSemaphore,523numBuffers);524reset_command_pool(info, 0);525}526527void CommandBufferExplicitHardResetBenchmark(sample_info &info,528VkClearValue *clear_values,529VkFence drawFence,530VkSemaphore imageAcquiredSemaphore,531int numBuffers)532{533SecondaryCommandBufferBenchmark(info, clear_values, drawFence, imageAcquiredSemaphore,534numBuffers);535// Explicitly resetting cmd buffers536reset_command_buffer2_array(info, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);537}538539void CommandBufferExplicitSoftResetBenchmark(sample_info &info,540VkClearValue *clear_values,541VkFence drawFence,542VkSemaphore imageAcquiredSemaphore,543int numBuffers)544{545SecondaryCommandBufferBenchmark(info, clear_values, drawFence, imageAcquiredSemaphore,546numBuffers);547// Explicitly resetting cmd buffers w/ soft reset (don't release resources)548reset_command_buffer2_array(info, 0);549}550551void CommandBufferImplicitResetBenchmark(sample_info &info,552VkClearValue *clear_values,553VkFence drawFence,554VkSemaphore imageAcquiredSemaphore,555int numBuffers)556{557// Repeated call SCBBenchmark & BeginCmdBuffer calls will implicitly reset each cmd buffer558SecondaryCommandBufferBenchmark(info, clear_values, drawFence, imageAcquiredSemaphore,559numBuffers);560}561562CommandBufferTestParams PrimaryCBHundredIndividualParams()563{564CommandBufferTestParams params;565params.CBImplementation = PrimaryCommandBufferBenchmarkHundredIndividual;566params.story = "_PrimaryCB_Submit_100_With_1_Draw";567return params;568}569570CommandBufferTestParams PrimaryCBOneWithOneHundredParams()571{572CommandBufferTestParams params;573params.CBImplementation = PrimaryCommandBufferBenchmarkOneWithOneHundred;574params.story = "_PrimaryCB_Submit_1_With_100_Draw";575return params;576}577578CommandBufferTestParams SecondaryCBParams()579{580CommandBufferTestParams params;581params.CBImplementation = SecondaryCommandBufferBenchmark;582params.story = "_SecondaryCB_Submit_1_With_100_Draw_In_Individual_Secondary";583return params;584}585586CommandBufferTestParams CommandPoolDestroyParams()587{588CommandBufferTestParams params;589params.CBImplementation = CommandPoolDestroyBenchmark;590params.story = "_Reset_CBs_With_Destroy_Command_Pool";591return params;592}593594CommandBufferTestParams CommandPoolHardResetParams()595{596CommandBufferTestParams params;597params.CBImplementation = CommandPoolHardResetBenchmark;598params.story = "_Reset_CBs_With_Hard_Reset_Command_Pool";599return params;600}601602CommandBufferTestParams CommandPoolSoftResetParams()603{604CommandBufferTestParams params;605params.CBImplementation = CommandPoolSoftResetBenchmark;606params.story = "_Reset_CBs_With_Soft_Reset_Command_Pool";607return params;608}609610CommandBufferTestParams CommandBufferExplicitHardResetParams()611{612CommandBufferTestParams params;613params.CBImplementation = CommandBufferExplicitHardResetBenchmark;614params.story = "_Reset_CBs_With_Explicit_Hard_Reset_Command_Buffers";615return params;616}617618CommandBufferTestParams CommandBufferExplicitSoftResetParams()619{620CommandBufferTestParams params;621params.CBImplementation = CommandBufferExplicitSoftResetBenchmark;622params.story = "_Reset_CBs_With_Explicit_Soft_Reset_Command_Buffers";623return params;624}625626CommandBufferTestParams CommandBufferImplicitResetParams()627{628CommandBufferTestParams params;629params.CBImplementation = CommandBufferImplicitResetBenchmark;630params.story = "_Reset_CBs_With_Implicit_Reset_Command_Buffers";631return params;632}633634TEST_P(VulkanCommandBufferPerfTest, Run)635{636run();637}638639INSTANTIATE_TEST_SUITE_P(,640VulkanCommandBufferPerfTest,641::testing::Values(PrimaryCBHundredIndividualParams(),642PrimaryCBOneWithOneHundredParams(),643SecondaryCBParams(),644CommandPoolDestroyParams(),645CommandPoolHardResetParams(),646CommandPoolSoftResetParams(),647CommandBufferExplicitHardResetParams(),648CommandBufferExplicitSoftResetParams(),649CommandBufferImplicitResetParams()));650651652