Commit 18dd0c28 by Jamie Madill Committed by Commit Bot

Vulkan: Add command buffer performance counter.

Adds a counter for the secondary command buffers (non-RenderPass). We'll use this in an upcoming test that validates that ANGLE only issues a single barrier (CB) in some buffer read/write scenarios. Also adds a PerfCounters struct. Bug: angleproject:4429 Change-Id: Iaf75ca89da3d02753897cb4066e2c56db497417e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2334090Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent ea952ff3
......@@ -655,9 +655,7 @@ ContextVk::ContextVk(const gl::State &state, gl::ErrorSet *errorSet, RendererVk
mGpuEventsEnabled(false),
mGpuClockSync{std::numeric_limits<double>::max(), std::numeric_limits<double>::max()},
mGpuEventTimestampOrigin(0),
mPrimaryBufferCounter(0),
mRenderPassCounter(0),
mWriteDescriptorSetCounter(0),
mPerfCounters{},
mContextPriority(renderer->getDriverPriority(GetContextPriority(state))),
mCurrentIndirectBuffer(nullptr),
mShareGroupVk(vk::GetImpl(state.getShareGroup()))
......@@ -904,9 +902,9 @@ angle::Result ContextVk::initialize()
vk::kDefaultTimestampQueryPoolSize));
ANGLE_TRY(synchronizeCpuGpuTime());
mPrimaryBufferCounter++;
mPerfCounters.primaryBuffers++;
EventName eventName = GetTraceEventName("Primary", mPrimaryBufferCounter);
EventName eventName = GetTraceEventName("Primary", mPerfCounters.primaryBuffers);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_BEGIN, eventName));
}
......@@ -1631,10 +1629,10 @@ void ContextVk::updateOverlayOnPresent()
{
gl::RunningGraphWidget *writeDescriptorSetCount =
mState.getOverlay()->getRunningGraphWidget(gl::WidgetId::VulkanWriteDescriptorSetCount);
writeDescriptorSetCount->add(mWriteDescriptorSetCounter);
writeDescriptorSetCount->add(mPerfCounters.writeDescriptorSets);
writeDescriptorSetCount->next();
mWriteDescriptorSetCounter = 0;
mPerfCounters.writeDescriptorSets = 0;
}
}
......@@ -4003,7 +4001,7 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore)
if (mGpuEventsEnabled)
{
EventName eventName = GetTraceEventName("Primary", mPrimaryBufferCounter);
EventName eventName = GetTraceEventName("Primary", mPerfCounters.primaryBuffers);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_END, eventName));
}
......@@ -4042,17 +4040,18 @@ angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore)
ANGLE_TRY(startPrimaryCommandBuffer());
mRenderPassCounter = 0;
mWriteDescriptorSetCounter = 0;
mPerfCounters.renderPasses = 0;
mPerfCounters.writeDescriptorSets = 0;
mPerfCounters.flushedOutsideRenderPassCommandBuffers = 0;
mWaitSemaphores.clear();
mWaitSemaphoreStageMasks.clear();
mPrimaryBufferCounter++;
mPerfCounters.primaryBuffers++;
if (mGpuEventsEnabled)
{
EventName eventName = GetTraceEventName("Primary", mPrimaryBufferCounter);
EventName eventName = GetTraceEventName("Primary", mPerfCounters.primaryBuffers);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_BEGIN, eventName));
}
......@@ -4480,11 +4479,11 @@ angle::Result ContextVk::endRenderPass()
onRenderPassFinished();
mRenderPassCounter++;
mPerfCounters.renderPasses++;
if (mGpuEventsEnabled)
{
EventName eventName = GetTraceEventName("RP", mRenderPassCounter);
EventName eventName = GetTraceEventName("RP", mPerfCounters.renderPasses);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_BEGIN, eventName));
ANGLE_TRY(flushOutsideRenderPassCommands());
......@@ -4508,7 +4507,7 @@ angle::Result ContextVk::endRenderPass()
if (mGpuEventsEnabled)
{
EventName eventName = GetTraceEventName("RP", mRenderPassCounter);
EventName eventName = GetTraceEventName("RP", mPerfCounters.renderPasses);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_END, eventName));
ANGLE_TRY(flushOutsideRenderPassCommands());
......@@ -4642,6 +4641,7 @@ angle::Result ContextVk::flushOutsideRenderPassCommands()
ANGLE_TRY(mOutsideRenderPassCommands->flushToPrimary(this, &mPrimaryCommands));
}
mHasPrimaryCommands = true;
mPerfCounters.flushedOutsideRenderPassCommandBuffers++;
}
return angle::Result::Continue;
}
......@@ -4747,7 +4747,7 @@ VkDescriptorImageInfo *ContextVk::allocDescriptorImageInfos(size_t count)
VkWriteDescriptorSet *ContextVk::allocWriteDescriptorSets(size_t count)
{
mWriteDescriptorSetCounter += count;
mPerfCounters.writeDescriptorSets += count;
size_t oldSize = mWriteDescriptorSets.size();
size_t newSize = oldSize + count;
......
......@@ -596,8 +596,7 @@ class ContextVk : public ContextImpl, public vk::Context
vk::BufferHelper &getEmptyBuffer() { return mEmptyBuffer; }
vk::DynamicBuffer *getStagingBufferStorage() { return &mStagingBufferStorage; }
uint32_t getRenderPassCounter() const { return mRenderPassCounter; }
uint32_t getWriteDescriptorSetCounter() const { return mWriteDescriptorSetCounter; }
const vk::PerfCounters &getPerfCounters() const { return mPerfCounters; }
private:
// Dirty bits.
......@@ -1048,10 +1047,8 @@ class ContextVk : public ContextImpl, public vk::Context
// double.
uint64_t mGpuEventTimestampOrigin;
// Used to count events for tracing.
uint32_t mPrimaryBufferCounter;
uint32_t mRenderPassCounter;
uint32_t mWriteDescriptorSetCounter;
// A mix of per-frame and per-run counters.
vk::PerfCounters mPerfCounters;
gl::State::DirtyBits mPipelineDirtyBitsMask;
......
......@@ -743,6 +743,15 @@ class ResourceSerialFactory final : angle::NonCopyable
// Kept atomic so it can be accessed from multiple Context threads at once.
std::atomic<uint32_t> mCurrentUniqueSerial;
};
// Performance and resource counters.
struct PerfCounters
{
uint32_t primaryBuffers;
uint32_t renderPasses;
uint32_t writeDescriptorSets;
uint32_t flushedOutsideRenderPassCommandBuffers;
};
} // namespace vk
#if !defined(ANGLE_SHARED_LIBVULKAN)
......
......@@ -28,11 +28,11 @@ namespace
class VulkanPerformanceCounterTest : public ANGLETest
{
protected:
rx::ContextVk *hackANGLE() const
const rx::vk::PerfCounters &hackANGLE() const
{
// Hack the angle!
const gl::Context *context = static_cast<gl::Context *>(getEGLWindow()->getContext());
return rx::GetImplAs<rx::ContextVk>(context);
return rx::GetImplAs<rx::ContextVk>(context)->getPerfCounters();
}
};
......@@ -42,7 +42,7 @@ TEST_P(VulkanPerformanceCounterTest, NewTextureDoesNotBreakRenderPass)
// TODO(jmadill): Fix test. http://anglebug.com/4911
ANGLE_SKIP_TEST_IF(IsVulkan());
rx::ContextVk *contextVk = hackANGLE();
const rx::vk::PerfCounters &counters = hackANGLE();
GLColor kInitialData[4] = {GLColor::red, GLColor::blue, GLColor::green, GLColor::yellow};
......@@ -72,7 +72,7 @@ TEST_P(VulkanPerformanceCounterTest, NewTextureDoesNotBreakRenderPass)
glDrawArrays(GL_TRIANGLES, 0, 6);
ASSERT_GL_NO_ERROR();
uint32_t expectedRenderPassCount = contextVk->getRenderPassCounter();
uint32_t expectedRenderPassCount = counters.renderPasses;
// Step 2: Introduce a new 2D Texture with the same Program and Framebuffer.
GLTexture newTexture;
......@@ -84,14 +84,14 @@ TEST_P(VulkanPerformanceCounterTest, NewTextureDoesNotBreakRenderPass)
glDrawArrays(GL_TRIANGLES, 0, 6);
ASSERT_GL_NO_ERROR();
uint32_t actualRenderPassCount = contextVk->getRenderPassCounter();
uint32_t actualRenderPassCount = counters.renderPasses;
EXPECT_EQ(expectedRenderPassCount, actualRenderPassCount);
}
// Tests that changing a Texture's max level hits the descriptor set cache.
TEST_P(VulkanPerformanceCounterTest, ChangingMaxLevelHitsDescriptorCache)
{
rx::ContextVk *contextVk = hackANGLE();
const rx::vk::PerfCounters &counters = hackANGLE();
GLColor kInitialData[4] = {GLColor::red, GLColor::blue, GLColor::green, GLColor::yellow};
......@@ -129,14 +129,14 @@ TEST_P(VulkanPerformanceCounterTest, ChangingMaxLevelHitsDescriptorCache)
glDrawArrays(GL_TRIANGLES, 0, 6);
ASSERT_GL_NO_ERROR();
uint32_t expectedWriteDescriptorSetCount = contextVk->getWriteDescriptorSetCounter();
uint32_t expectedWriteDescriptorSetCount = counters.writeDescriptorSets;
// Step 3: Change max level back to original value and verify we hit the cache.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
glDrawArrays(GL_TRIANGLES, 0, 6);
ASSERT_GL_NO_ERROR();
uint32_t actualWriteDescriptorSetCount = contextVk->getWriteDescriptorSetCounter();
uint32_t actualWriteDescriptorSetCount = counters.writeDescriptorSets;
EXPECT_EQ(expectedWriteDescriptorSetCount, actualWriteDescriptorSetCount);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment