Syntactically simplify tracking of outstanding occlusion queries.

Add MVKOcclusionQueryCommandEncoderState::OcclusionQueryLocation to
more directly track occlusion query locations in temp visibility buffer.
This commit is contained in:
Bill Hollings 2021-06-21 12:37:46 -04:00
parent e72cd614e1
commit 53dde5718a
2 changed files with 16 additions and 12 deletions

View File

@ -614,7 +614,17 @@ public:
protected: protected:
void encodeImpl(uint32_t) override; 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; MTLVisibilityResultMode _mtlVisibilityResultMode = MTLVisibilityResultModeDisabled;
}; };

View File

@ -1080,14 +1080,13 @@ void MVKOcclusionQueryCommandEncoderState::endMetalRenderPass() {
id<MTLComputePipelineState> mtlAccumState = _cmdEncoder->getCommandEncodingPool()->getAccumulateOcclusionQueryResultsMTLComputePipelineState(); id<MTLComputePipelineState> mtlAccumState = _cmdEncoder->getCommandEncodingPool()->getAccumulateOcclusionQueryResultsMTLComputePipelineState();
id<MTLComputeCommandEncoder> mtlAccumEncoder = _cmdEncoder->getMTLComputeEncoder(kMVKCommandUseAccumOcclusionQuery); id<MTLComputeCommandEncoder> mtlAccumEncoder = _cmdEncoder->getMTLComputeEncoder(kMVKCommandUseAccumOcclusionQuery);
[mtlAccumEncoder setComputePipelineState: mtlAccumState]; [mtlAccumEncoder setComputePipelineState: mtlAccumState];
for (auto& query : _mtlRenderPassQueries) { for (auto& qryLoc : _mtlRenderPassQueries) {
// Accumulate the current results to the query pool's buffer. // Accumulate the current results to the query pool's buffer.
auto* pQueryPool = (MVKOcclusionQueryPool*)query.first.queryPool; [mtlAccumEncoder setBuffer: qryLoc.queryPool->getVisibilityResultMTLBuffer()
[mtlAccumEncoder setBuffer: pQueryPool->getVisibilityResultMTLBuffer() offset: qryLoc.queryPool->getVisibilityResultOffset(qryLoc.query)
offset: pQueryPool->getVisibilityResultOffset(query.first.query)
atIndex: 0]; atIndex: 0];
[mtlAccumEncoder setBuffer: vizResultBuffer->_mtlBuffer [mtlAccumEncoder setBuffer: vizResultBuffer->_mtlBuffer
offset: vizResultBuffer->_offset + query.second offset: vizResultBuffer->_offset + qryLoc.visibilityBufferOffset
atIndex: 1]; atIndex: 1];
[mtlAccumEncoder dispatchThreadgroups: MTLSizeMake(1, 1, 1) [mtlAccumEncoder dispatchThreadgroups: MTLSizeMake(1, 1, 1)
threadsPerThreadgroup: MTLSizeMake(1, 1, 1)]; threadsPerThreadgroup: MTLSizeMake(1, 1, 1)];
@ -1097,14 +1096,9 @@ void MVKOcclusionQueryCommandEncoderState::endMetalRenderPass() {
} }
void MVKOcclusionQueryCommandEncoderState::beginOcclusionQuery(MVKOcclusionQueryPool* pQueryPool, uint32_t query, VkQueryControlFlags flags) { 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); bool shouldCount = _cmdEncoder->_pDeviceFeatures->occlusionQueryPrecise && mvkAreAllFlagsEnabled(flags, VK_QUERY_CONTROL_PRECISE_BIT);
_mtlVisibilityResultMode = shouldCount ? MTLVisibilityResultModeCounting : MTLVisibilityResultModeBoolean; _mtlVisibilityResultMode = shouldCount ? MTLVisibilityResultModeCounting : MTLVisibilityResultModeBoolean;
_mtlRenderPassQueries.emplace_back(pQueryPool, query, _cmdEncoder->_pEncodingContext->mtlVisibilityResultOffset);
markDirty(); markDirty();
} }