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:
parent
e72cd614e1
commit
53dde5718a
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user