From 4ad5930263617c43399d42c2533810a412afb7bf Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Mon, 13 Sep 2021 17:20:00 -0400 Subject: [PATCH] Improved checks for timestamp GPU counter support on older devices. Check that appropriate GPU counter set is supported on the device before creating GPU counter sample buffer. Don't attempt to timestamp using GPU counters unless a GPU sample counter buffer has been created. --- Docs/Whats_New.md | 1 + MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm | 4 ++-- MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.h | 3 +++ MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md index 0c349d3f..35028b9d 100644 --- a/Docs/Whats_New.md +++ b/Docs/Whats_New.md @@ -19,6 +19,7 @@ MoltenVK 1.1.6 Released TBD - Support maximum point primitive size of 511. +- Improved checks for timestamp GPU counter support on older devices. - Update to latest SPIRV-Cross version: - Add support for `OpSpecConstantOp` ops `OpQuantizeToF16` and `OpSRem`. diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm index 5f1c6dd7..c9a176c7 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm +++ b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm @@ -768,8 +768,8 @@ void MVKCommandEncoder::markTimestamp(MVKTimestampQueryPool* pQueryPool, uint32_ } addActivatedQueries(pQueryPool, query, queryCount); - MVKCounterSamplingFlags sampPts = _device->_pMetalFeatures->counterSamplingPoints; - if (sampPts) { + if (pQueryPool->hasMTLCounterBuffer()) { + MVKCounterSamplingFlags sampPts = _device->_pMetalFeatures->counterSamplingPoints; for (uint32_t qOfst = 0; qOfst < queryCount; qOfst++) { if (mvkIsAnyFlagEnabled(sampPts, MVK_COUNTER_SAMPLING_AT_PIPELINE_STAGE)) { _timestampStageCounterQueries.push_back({ pQueryPool, query + qOfst }); diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.h b/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.h index 9ab62f46..45555fec 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.h @@ -182,6 +182,9 @@ class MVKGPUCounterQueryPool : public MVKQueryPool { public: + /** Returns whether a MTLCounterBuffer is being used by this query pool. */ + bool hasMTLCounterBuffer() { return _mtlCounterBuffer != nil; } + /** * Returns the MTLCounterBuffer being used by this query pool, * or returns nil if GPU counters are not supported. diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm b/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm index 4df2aa3b..7362475f 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm @@ -335,7 +335,7 @@ MVKGPUCounterQueryPool::MVKGPUCounterQueryPool(MVKDevice* device, const VkQueryP void MVKGPUCounterQueryPool::initMTLCounterSampleBuffer(const VkQueryPoolCreateInfo* pCreateInfo, id mtlCounterSet, const char* queryTypeName) { - if ( !_device->_pMetalFeatures->counterSamplingPoints ) { return; } + if ( !mtlCounterSet ) { return; } @autoreleasepool { MTLCounterSampleBufferDescriptor* tsDesc = [[[MTLCounterSampleBufferDescriptor alloc] init] autorelease];