Guard against null _debugNames being used to build name strings.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
index db650c9..1e063c6 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
@@ -29,7 +29,8 @@
#pragma mark MVKBuffer
void MVKBuffer::propogateDebugName() {
- if (_deviceMemory &&
+ if (_debugName &&
+ _deviceMemory &&
_deviceMemory->isDedicatedAllocation() &&
_deviceMemory->_debugName.length == 0) {
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
index 173e96c..9136263 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
@@ -429,6 +429,9 @@
// Output
addFragmentOutputToPipeline(plDesc, reflectData, pCreateInfo);
+ // Metal does not allow the name of the pipeline to be changed after it has been created,
+ // and we need to create the Metal pipeline immediately to provide error feedback to app.
+ // The best we can do at this point is set the pipeline name from the layout.
setLabelIfNotNil(plDesc, ((MVKPipelineLayout*)pCreateInfo->layout)->getDebugName());
return plDesc;
@@ -580,6 +583,9 @@
}
plDesc.stageInputDescriptor.indexBufferIndex = kMVKTessCtlIndexBufferIndex;
+ // Metal does not allow the name of the pipeline to be changed after it has been created,
+ // and we need to create the Metal pipeline immediately to provide error feedback to app.
+ // The best we can do at this point is set the pipeline name from the layout.
setLabelIfNotNil(plDesc, ((MVKPipelineLayout*)pCreateInfo->layout)->getDebugName());
return plDesc;
@@ -1172,6 +1178,10 @@
if (shaderFunc.mtlFunction) {
MTLComputePipelineDescriptor* plDesc = [[MTLComputePipelineDescriptor new] autorelease];
plDesc.computeFunction = shaderFunc.mtlFunction;
+
+ // Metal does not allow the name of the pipeline to be changed after it has been created,
+ // and we need to create the Metal pipeline immediately to provide error feedback to app.
+ // The best we can do at this point is set the pipeline name from the layout.
setLabelIfNotNil(plDesc, ((MVKPipelineLayout*)pCreateInfo->layout)->getDebugName());
MVKComputePipelineCompiler* plc = new MVKComputePipelineCompiler(this);
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
index 47c711b..42a3b8b 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
@@ -35,9 +35,11 @@
#pragma mark MVKSwapchain
void MVKSwapchain::propogateDebugName() {
- size_t imgCnt = _surfaceImages.size();
- for (size_t imgIdx = 0; imgIdx < imgCnt; imgIdx++) {
- _surfaceImages[imgIdx]->setDebugName([NSString stringWithFormat: @"%@(%lu)", _debugName, imgIdx].UTF8String);
+ if (_debugName) {
+ size_t imgCnt = _surfaceImages.size();
+ for (size_t imgIdx = 0; imgIdx < imgCnt; imgIdx++) {
+ _surfaceImages[imgIdx]->setDebugName([NSString stringWithFormat: @"%@(%lu)", _debugName, imgIdx].UTF8String);
+ }
}
}
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm b/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
index 8815dab..0c5c10e 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
@@ -55,9 +55,11 @@
}
VkResult MVKVulkanAPIObject::setDebugName(const char* pObjectName) {
- [_debugName release];
- _debugName = [[NSString stringWithUTF8String: pObjectName] retain]; // retained
- propogateDebugName();
+ if (pObjectName) {
+ [_debugName release];
+ _debugName = [[NSString stringWithUTF8String: pObjectName] retain]; // retained
+ propogateDebugName();
+ }
return VK_SUCCESS;
}