diff options
author | Jamie Madill <jmadill@chromium.org> | 2022-04-14 07:58:32 -0400 |
---|---|---|
committer | Angle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-04-20 13:37:34 +0000 |
commit | b2a1f0d28a62c36b057a482a599db958faaac2e3 (patch) | |
tree | 76855778d07763df45a130988c194b6bd11450c6 | |
parent | 37cdf93d061b8e77320dba27bf4c847bb7a4ec5a (diff) | |
download | angle-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.cpp | 20 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/ContextVk.h | 4 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp | 15 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/ProgramExecutableVk.h | 3 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/SurfaceVk.cpp | 2 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/vk_cache_utils.h | 6 | ||||
-rw-r--r-- | src/tests/angle_end2end_tests_expectations.txt | 2 | ||||
-rw-r--r-- | src/tests/gl_tests/VulkanPerformanceCounterTest.cpp | 5 | ||||
-rw-r--r-- | src/tests/perf_tests/ANGLEPerfTest.cpp | 36 |
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, {}}; |