Fix deletion of GPU counter MTLFence while it is being used by MTLCommandBuffer.

Move release of GPU counter MTLFence from MVKCommandEncoder destructor
to MTLCommandBuffer completion handler.
This commit is contained in:
Bill Hollings 2022-03-10 13:25:09 -05:00
parent da0f15c7b0
commit 2aadca70ce
3 changed files with 9 additions and 8 deletions

View File

@ -22,6 +22,7 @@ Released TBD
- Support base vertex instance support in shader conversion. - Support base vertex instance support in shader conversion.
- Fix alignment between outputs and inputs between shader stages when using nested structures. - Fix alignment between outputs and inputs between shader stages when using nested structures.
- Fix issue where the depth component of a stencil-only renderpass attachment was incorrectly attempting to be stored. - Fix issue where the depth component of a stencil-only renderpass attachment was incorrectly attempting to be stored.
- Fix deletion of GPU counter `MTLFence` while it is being used by `MTLCommandBuffer`.
- `MoltenVKShaderConverter` tool defaults to the highest MSL version supported on runtime OS. - `MoltenVKShaderConverter` tool defaults to the highest MSL version supported on runtime OS.
- Update *glslang* version, to use `python3` in *glslang* scripts, to replace missing `python` on *macOS 12.3*. - Update *glslang* version, to use `python3` in *glslang* scripts, to replace missing `python` on *macOS 12.3*.
- Update to latest SPIRV-Cross: - Update to latest SPIRV-Cross:

View File

@ -29,7 +29,6 @@
#include <unordered_map> #include <unordered_map>
class MVKCommandPool; class MVKCommandPool;
class MVKQueue;
class MVKQueueCommandBufferSubmission; class MVKQueueCommandBufferSubmission;
class MVKCommandEncoder; class MVKCommandEncoder;
class MVKCommandEncodingPool; class MVKCommandEncodingPool;
@ -492,8 +491,6 @@ public:
MVKCommandEncoder(MVKCommandBuffer* cmdBuffer); MVKCommandEncoder(MVKCommandBuffer* cmdBuffer);
~MVKCommandEncoder() override;
protected: protected:
void addActivatedQueries(MVKQueryPool* pQueryPool, uint32_t query, uint32_t queryCount); void addActivatedQueries(MVKQueryPool* pQueryPool, uint32_t query, uint32_t queryCount);
void finishQueries(); void finishQueries();

View File

@ -830,7 +830,14 @@ void MVKCommandEncoder::encodeTimestampStageCounterSamples() {}
#endif #endif
id<MTLFence> MVKCommandEncoder::getStageCountersMTLFence() { id<MTLFence> MVKCommandEncoder::getStageCountersMTLFence() {
if ( !_stageCountersMTLFence ) { _stageCountersMTLFence = [getMTLDevice() newFence]; } //retained if ( !_stageCountersMTLFence ) {
// Create MTLFence as local ref and pass to completion handler
// block to release once MTLCommandBuffer no longer needs it.
id<MTLFence> mtlFence = [getMTLDevice() newFence];
[_mtlCmdBuffer addCompletedHandler: ^(id<MTLCommandBuffer> mcb) { [mtlFence release]; }];
_stageCountersMTLFence = mtlFence; // retained
}
return _stageCountersMTLFence; return _stageCountersMTLFence;
} }
@ -899,10 +906,6 @@ MVKCommandEncoder::MVKCommandEncoder(MVKCommandBuffer* cmdBuffer) : MVKBaseDevic
_stageCountersMTLFence = nil; _stageCountersMTLFence = nil;
} }
MVKCommandEncoder::~MVKCommandEncoder() {
[_stageCountersMTLFence release];
}
#pragma mark - #pragma mark -
#pragma mark Support functions #pragma mark Support functions