Syntactically simplify tracking of outstanding occlusion queries.
Add MVKOcclusionQueryCommandEncoderState::OcclusionQueryLocation to
more directly track occlusion query locations in temp visibility buffer.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.h b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.h
index 0608f36..572a732 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.h
@@ -614,7 +614,17 @@
protected:
void encodeImpl(uint32_t) override;
- MVKSmallVector<std::pair<MVKQuerySpec, NSUInteger>> _mtlRenderPassQueries;
+ typedef struct OcclusionQueryLocation {
+ MVKOcclusionQueryPool* queryPool = nullptr;
+ uint32_t query = 0;
+ NSUInteger visibilityBufferOffset = 0;
+
+ OcclusionQueryLocation(MVKOcclusionQueryPool* qPool, uint32_t qIdx, NSUInteger vbOfst)
+ : queryPool(qPool), query(qIdx), visibilityBufferOffset(vbOfst) {}
+
+ } OcclusionQueryLocation;
+
+ MVKSmallVector<OcclusionQueryLocation> _mtlRenderPassQueries;
MTLVisibilityResultMode _mtlVisibilityResultMode = MTLVisibilityResultModeDisabled;
};
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm
index 8f9ed36..2f9312b 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm
@@ -1080,14 +1080,13 @@
id<MTLComputePipelineState> mtlAccumState = _cmdEncoder->getCommandEncodingPool()->getAccumulateOcclusionQueryResultsMTLComputePipelineState();
id<MTLComputeCommandEncoder> mtlAccumEncoder = _cmdEncoder->getMTLComputeEncoder(kMVKCommandUseAccumOcclusionQuery);
[mtlAccumEncoder setComputePipelineState: mtlAccumState];
- for (auto& query : _mtlRenderPassQueries) {
+ for (auto& qryLoc : _mtlRenderPassQueries) {
// Accumulate the current results to the query pool's buffer.
- auto* pQueryPool = (MVKOcclusionQueryPool*)query.first.queryPool;
- [mtlAccumEncoder setBuffer: pQueryPool->getVisibilityResultMTLBuffer()
- offset: pQueryPool->getVisibilityResultOffset(query.first.query)
+ [mtlAccumEncoder setBuffer: qryLoc.queryPool->getVisibilityResultMTLBuffer()
+ offset: qryLoc.queryPool->getVisibilityResultOffset(qryLoc.query)
atIndex: 0];
[mtlAccumEncoder setBuffer: vizResultBuffer->_mtlBuffer
- offset: vizResultBuffer->_offset + query.second
+ offset: vizResultBuffer->_offset + qryLoc.visibilityBufferOffset
atIndex: 1];
[mtlAccumEncoder dispatchThreadgroups: MTLSizeMake(1, 1, 1)
threadsPerThreadgroup: MTLSizeMake(1, 1, 1)];
@@ -1097,14 +1096,9 @@
}
void MVKOcclusionQueryCommandEncoderState::beginOcclusionQuery(MVKOcclusionQueryPool* pQueryPool, uint32_t query, VkQueryControlFlags flags) {
-
- MVKQuerySpec querySpec;
- querySpec.set(pQueryPool, query);
- _mtlRenderPassQueries.push_back(make_pair(querySpec, _cmdEncoder->_pEncodingContext->mtlVisibilityResultOffset));
-
bool shouldCount = _cmdEncoder->_pDeviceFeatures->occlusionQueryPrecise && mvkAreAllFlagsEnabled(flags, VK_QUERY_CONTROL_PRECISE_BIT);
_mtlVisibilityResultMode = shouldCount ? MTLVisibilityResultModeCounting : MTLVisibilityResultModeBoolean;
-
+ _mtlRenderPassQueries.emplace_back(pQueryPool, query, _cmdEncoder->_pEncodingContext->mtlVisibilityResultOffset);
markDirty();
}