aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Madill <jmadill@chromium.org>2022-04-14 07:58:32 -0400
committerAngle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-04-20 13:37:34 +0000
commitb2a1f0d28a62c36b057a482a599db958faaac2e3 (patch)
tree76855778d07763df45a130988c194b6bd11450c6
parent37cdf93d061b8e77320dba27bf4c847bb7a4ec5a (diff)
downloadangle-b2a1f0d28a62c36b057a482a599db958faaac2e3.tar.gz
Track total vs per-frame descriptor set counters.
This will give more consistent measurements for descriptor set caches and descriptor set allocations. Bug: angleproject:6776 Change-Id: I584b8807ad19f8393ae54cc1d88b319c8f7f9f39 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3584636 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
-rw-r--r--src/libANGLE/renderer/vulkan/ContextVk.cpp20
-rw-r--r--src/libANGLE/renderer/vulkan/ContextVk.h4
-rw-r--r--src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp15
-rw-r--r--src/libANGLE/renderer/vulkan/ProgramExecutableVk.h3
-rw-r--r--src/libANGLE/renderer/vulkan/SurfaceVk.cpp2
-rw-r--r--src/libANGLE/renderer/vulkan/vk_cache_utils.h6
-rw-r--r--src/tests/angle_end2end_tests_expectations.txt2
-rw-r--r--src/tests/gl_tests/VulkanPerformanceCounterTest.cpp5
-rw-r--r--src/tests/perf_tests/ANGLEPerfTest.cpp36
9 files changed, 69 insertions, 24 deletions
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index ae4061a413..62c5978b1c 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -2474,8 +2474,7 @@ void ContextVk::syncObjectPerfCounters()
mPerfCounters.dynamicBufferAllocations = 0;
// ProgramExecutableVk's descriptor set allocations
- const gl::State &state = getState();
- const gl::ShaderProgramManager &shadersAndPrograms = state.getShaderProgramManagerForCapture();
+ const gl::ShaderProgramManager &shadersAndPrograms = mState.getShaderProgramManagerForCapture();
const gl::ResourceMap<gl::Program, gl::ShaderProgramID> &programs =
shadersAndPrograms.getProgramsForCaptureAndPerf();
for (const std::pair<GLuint, gl::Program *> &resource : programs)
@@ -2487,7 +2486,7 @@ void ContextVk::syncObjectPerfCounters()
}
ProgramVk *programVk = vk::GetImpl(resource.second);
ProgramExecutablePerfCounters progPerfCounters =
- programVk->getExecutable().getAndResetObjectPerfCounters();
+ programVk->getExecutable().getDescriptorSetPerfCounters();
mPerfCounters.uniformsAndXfbDescriptorSetCacheHits +=
progPerfCounters.cacheStats[DescriptorSetIndex::UniformsAndXfb].getHitCount();
@@ -6146,8 +6145,6 @@ angle::Result ContextVk::flushAndGetSerial(const vk::Semaphore *signalSemaphore,
ANGLE_TRY(submitFrame(signalSemaphore, submitSerialOut));
- resetPerFramePerfCounters();
-
ASSERT(mWaitSemaphores.empty());
ASSERT(mWaitSemaphoreStageMasks.empty());
@@ -7229,5 +7226,18 @@ void ContextVk::resetPerFramePerfCounters()
mPerfCounters.flushedOutsideRenderPassCommandBuffers = 0;
mPerfCounters.resolveImageCommands = 0;
mPerfCounters.descriptorSetAllocations = 0;
+
+ const gl::ResourceMap<gl::Program, gl::ShaderProgramID> &programs =
+ mState.getShaderProgramManagerForCapture().getProgramsForCaptureAndPerf();
+ for (const std::pair<GLuint, gl::Program *> &resource : programs)
+ {
+ gl::Program *program = resource.second;
+ if (program->hasLinkingState())
+ {
+ continue;
+ }
+ ProgramVk *programVk = vk::GetImpl(program);
+ programVk->getExecutable().resetDescriptorSetPerfCounters();
+ }
}
} // namespace rx
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.h b/src/libANGLE/renderer/vulkan/ContextVk.h
index 78178560aa..f8f79b5591 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.h
+++ b/src/libANGLE/renderer/vulkan/ContextVk.h
@@ -737,6 +737,8 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText
const angle::PerfMonitorCounterGroups &getPerfMonitorCounters() override;
+ void resetPerFramePerfCounters();
+
private:
// Dirty bits.
enum DirtyBitType : size_t
@@ -1164,8 +1166,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText
void updateShaderResourcesDescriptorDesc(PipelineType pipelineType);
- void resetPerFramePerfCounters();
-
std::array<GraphicsDirtyBitHandler, DIRTY_BIT_MAX> mGraphicsDirtyBitHandlers;
std::array<ComputeDirtyBitHandler, DIRTY_BIT_MAX> mComputeDirtyBitHandlers;
diff --git a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
index 87ea465241..461d68f63d 100644
--- a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
@@ -2035,8 +2035,9 @@ template angle::Result ProgramExecutableVk::updateDescriptorSets<vk::VulkanSecon
vk::VulkanSecondaryCommandBuffer *commandBuffer,
PipelineType pipelineType);
-ProgramExecutablePerfCounters ProgramExecutableVk::getAndResetObjectPerfCounters()
+ProgramExecutablePerfCounters ProgramExecutableVk::getDescriptorSetPerfCounters()
{
+ mPerfCounters.descriptorSetCacheKeySizesBytes = {};
mPerfCounters.descriptorSetCacheKeySizesBytes[DescriptorSetIndex::UniformsAndXfb] =
static_cast<uint32_t>(mUniformsAndXfbDescriptorsCache.getTotalCacheKeySizeBytes());
mPerfCounters.descriptorSetCacheKeySizesBytes[DescriptorSetIndex::Texture] =
@@ -2044,9 +2045,15 @@ ProgramExecutablePerfCounters ProgramExecutableVk::getAndResetObjectPerfCounters
mPerfCounters.descriptorSetCacheKeySizesBytes[DescriptorSetIndex::ShaderResource] =
static_cast<uint32_t>(mShaderBufferDescriptorsCache.getTotalCacheKeySizeBytes());
- ProgramExecutablePerfCounters counters = mPerfCounters;
- mPerfCounters.descriptorSetCacheKeySizesBytes = {};
- return counters;
+ return mPerfCounters;
+}
+
+void ProgramExecutableVk::resetDescriptorSetPerfCounters()
+{
+ for (CacheStats &cacheStats : mPerfCounters.cacheStats)
+ {
+ cacheStats.resetHitAndMissCount();
+ }
}
void ProgramExecutableVk::setAllDefaultUniformsDirty(const gl::ProgramExecutable &executable)
diff --git a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h
index cd540cbca3..30a74a744f 100644
--- a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h
+++ b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h
@@ -211,7 +211,8 @@ class ProgramExecutableVk
}
void accumulateCacheStats(VulkanCacheType cacheType, const CacheStats &cacheStats);
- ProgramExecutablePerfCounters getAndResetObjectPerfCounters();
+ ProgramExecutablePerfCounters getDescriptorSetPerfCounters();
+ void resetDescriptorSetPerfCounters();
size_t getDefaultUniformAlignedSize(vk::Context *context, gl::ShaderType shaderType) const
{
diff --git a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
index 7fde27a5e7..be99b33fcf 100644
--- a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
+++ b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
@@ -1816,6 +1816,8 @@ angle::Result WindowSurfaceVk::present(ContextVk *contextVk,
ANGLE_TRY(computePresentOutOfDate(contextVk, result, presentOutOfDate));
+ contextVk->resetPerFramePerfCounters();
+
return angle::Result::Continue;
}
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.h b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
index d5fb0a8ed7..7d32d38a7f 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
@@ -1566,6 +1566,12 @@ class CacheStats final : angle::NonCopyable
mSize = 0;
}
+ void resetHitAndMissCount()
+ {
+ mHitCount = 0;
+ mMissCount = 0;
+ }
+
private:
uint64_t mHitCount;
uint64_t mMissCount;
diff --git a/src/tests/angle_end2end_tests_expectations.txt b/src/tests/angle_end2end_tests_expectations.txt
index 94794897c9..4d71bf69d5 100644
--- a/src/tests/angle_end2end_tests_expectations.txt
+++ b/src/tests/angle_end2end_tests_expectations.txt
@@ -426,6 +426,8 @@
7140 PIXEL4ORXL VULKAN : DrawBuffersTest.MidRenderPassClearWithGaps/* = SKIP
7140 PIXEL4ORXL VULKAN : DrawBuffersTest.MidRenderPassClearWithGapsRGB/* = SKIP
+7207 PIXEL4ORXL VULKAN : VulkanPerformanceCounterTest.InRenderpassFlushShouldNotBreakRenderpass/* = SKIP
+
6167 NEXUS5X GLES : DepthStencilTestES3.FramebufferClearThenStencilAttachedThenStencilTestState/* = SKIP
6167 NEXUS5X GLES : DepthStencilTestES3.FramebufferClearThenStencilTestStateThenStencilAttached/* = SKIP
6167 NEXUS5X GLES : DepthStencilTestES3.StencilTestStateThenFramebufferClearThenStencilAttached/* = SKIP
diff --git a/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp b/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp
index 3837b27c65..b777782d75 100644
--- a/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp
+++ b/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp
@@ -4061,8 +4061,7 @@ void main()
}
}
- // TODO(syoussefi): Validate.
- ANGLE_UNUSED_VARIABLE(descriptorSetAllocationsBefore);
+ EXPECT_GT(descriptorSetAllocationsBefore, 0u);
ASSERT_GL_NO_ERROR();
@@ -4080,7 +4079,7 @@ void main()
// Check for unnecessary descriptor set allocations.
uint32_t descriptorSetAllocationsAfter = getPerfCounters().descriptorSetAllocations;
- EXPECT_EQ(descriptorSetAllocationsAfter, 0u);
+ EXPECT_EQ(descriptorSetAllocationsAfter, descriptorSetAllocationsBefore);
}
// Test that mapping a buffer that the GPU is using as read-only ghosts the buffer, rather than
diff --git a/src/tests/perf_tests/ANGLEPerfTest.cpp b/src/tests/perf_tests/ANGLEPerfTest.cpp
index f0d79a8b1e..ca583edec8 100644
--- a/src/tests/perf_tests/ANGLEPerfTest.cpp
+++ b/src/tests/perf_tests/ANGLEPerfTest.cpp
@@ -431,36 +431,47 @@ void ANGLEPerfTest::processResults()
const std::string &counterName = iter.second.name;
std::vector<GLuint> samples = iter.second.samples;
- size_t midpoint = samples.size() >> 1;
- std::nth_element(samples.begin(), samples.begin() + midpoint, samples.end());
-
+ // Median
{
+ size_t midpoint = samples.size() >> 1;
+ std::nth_element(samples.begin(), samples.begin() + midpoint, samples.end());
+
std::stringstream medianStr;
medianStr << "." << counterName << "_median";
std::string medianName = medianStr.str();
mReporter->AddResult(medianName, static_cast<size_t>(samples[midpoint]));
- }
- {
std::string measurement = mName + mBackend + "." + counterName + "_median";
TestSuite::GetInstance()->addHistogramSample(measurement, mStory, samples[midpoint],
"count");
}
- const auto &maxIt = std::max_element(samples.begin(), samples.end());
-
+ // Maximum
{
+ const auto &maxIt = std::max_element(samples.begin(), samples.end());
+
std::stringstream maxStr;
maxStr << "." << counterName << "_max";
std::string maxName = maxStr.str();
mReporter->AddResult(maxName, static_cast<size_t>(*maxIt));
- }
- {
std::string measurement = mName + mBackend + "." + counterName + "_max";
TestSuite::GetInstance()->addHistogramSample(measurement, mStory, *maxIt, "count");
}
+
+ // Sum
+ {
+ GLuint sum = std::accumulate(samples.begin(), samples.end(), 0);
+
+ std::stringstream sumStr;
+ sumStr << "." << counterName << "_sum";
+ std::string sumName = sumStr.str();
+ mReporter->AddResult(sumName, static_cast<size_t>(sum));
+
+ std::string measurement = mName + mBackend + "." + counterName + "_sum";
+ TestSuite::GetInstance()->addHistogramSample(measurement, mStory, sum, "count");
+ }
}
}
@@ -944,6 +955,13 @@ void ANGLERenderTest::initPerfCounters()
mReporter->RegisterImportantMetric(maxName, "count");
}
+ {
+ std::stringstream sumStr;
+ sumStr << '.' << indexMapName << "_sum";
+ std::string sumName = sumStr.str();
+ mReporter->RegisterImportantMetric(sumName, "count");
+ }
+
GLuint index = indexMapIter.second;
mPerfCounterInfo[index] = {indexMapName, {}};