From e6b8b380d4b44fd51b49f9520ca099be352d636c Mon Sep 17 00:00:00 2001 From: Isaac Marovitz Date: Sat, 20 Jan 2024 20:55:11 -0500 Subject: [PATCH] MTLComputePipelineDescriptor Pipeline Descriptor Correction --- renderdoc/driver/metal/metal_serialise.cpp | 22 ++++++++++ renderdoc/driver/metal/metal_types.cpp | 50 ++++++++++++++++++++++ renderdoc/driver/metal/metal_types.h | 26 +++++++++++ 3 files changed, 98 insertions(+) diff --git a/renderdoc/driver/metal/metal_serialise.cpp b/renderdoc/driver/metal/metal_serialise.cpp index b72c83e7c..aac184c9d 100644 --- a/renderdoc/driver/metal/metal_serialise.cpp +++ b/renderdoc/driver/metal/metal_serialise.cpp @@ -387,6 +387,27 @@ void DoSerialise(SerialiserType &ser, RDMTL::ComputePassSampleBufferAttachmentDe SERIALISE_MEMBER(endOfEncoderSampleIndex); } +template +void DoSerialise(SerialiserType &ser, RDMTL::ComputePipelineDescriptor &el) +{ + SERIALISE_MEMBER(label); + SERIALISE_MEMBER(computeFunction); + SERIALISE_MEMBER(threadGroupSizeIsMultipleOfThreadExecution); + SERIALISE_MEMBER(maxTotalThreadsPerThreadgroup); + SERIALISE_MEMBER(maxCallStackDepth); + SERIALISE_MEMBER(stageInputDescriptor); + SERIALISE_MEMBER(buffers); + SERIALISE_MEMBER(supportIndirectCommandBuffers); + // TODO: when WrappedMTLDynamicLibrary exists + // SERIALISE_MEMBER(preloadedLibraries); + // Deprecated + // SERIALISE_MEMBER(insertLibraries); + SERIALISE_MEMBER(linkedFunctions); + SERIALISE_MEMBER(supportAddingBinaryFunctions); + // TODO: when WrappedMTLBinaryArchive exists + // SERIALISE_MEMBER(binaryArchives); +} + INSTANTIATE_SERIALISE_TYPE(NS::String *); INSTANTIATE_SERIALISE_TYPE(NS::Range) INSTANTIATE_SERIALISE_TYPE(MTL::TextureSwizzleChannels); @@ -414,3 +435,4 @@ INSTANTIATE_SERIALISE_TYPE(RDMTL::RenderPassDepthAttachmentDescriptor); INSTANTIATE_SERIALISE_TYPE(RDMTL::RenderPassStencilAttachmentDescriptor); INSTANTIATE_SERIALISE_TYPE(RDMTL::RenderPassDescriptor); INSTANTIATE_SERIALISE_TYPE(RDMTL::ComputePassSampleBufferAttachmentDescriptor); +INSTANTIATE_SERIALISE_TYPE(RDMTL::ComputePipelineDescriptor); diff --git a/renderdoc/driver/metal/metal_types.cpp b/renderdoc/driver/metal/metal_types.cpp index 1696f4d70..a7773d346 100644 --- a/renderdoc/driver/metal/metal_types.cpp +++ b/renderdoc/driver/metal/metal_types.cpp @@ -681,4 +681,54 @@ void ComputePassSampleBufferAttachmentDescriptor::CopyTo( objc->setEndOfEncoderSampleIndex(endOfEncoderSampleIndex); } +ComputePipelineDescriptor::ComputePipelineDescriptor(MTL::ComputePipelineDescriptor *objc) + : computeFunction(GetWrapped(objc->computeFunction())), + threadGroupSizeIsMultipleOfThreadExecution( + objc->threadGroupSizeIsMultipleOfThreadExecutionWidth()), + maxTotalThreadsPerThreadgroup(objc->maxTotalThreadsPerThreadgroup()), + maxCallStackDepth(objc->maxCallStackDepth()), + stageInputDescriptor(objc->stageInputDescriptor()), + supportIndirectCommandBuffers(objc->supportIndirectCommandBuffers()), + linkedFunctions(objc->linkedFunctions()), + supportAddingBinaryFunctions(objc->supportAddingBinaryFunctions()) +{ + if(objc->label()) + label.assign(objc->label()->utf8String()); + GETOBJCARRAY(PipelineBufferDescriptor, MAX_COMPUTE_PASS_BUFFER_ATTACHMENTS, buffers, ValidData); + // TODO: when WrappedMTLDynamicLibrary exists + // GETWRAPPEDNSARRAY(DynamicLibrary, preloadedLibraries) + // Deprecated + // GETWRAPPEDNSARRAY(DynamicLibrary, insertLibraries) + // GETWRAPPEDNSARRAY(DynamicLibrary, linkedFunctions) + // TODO: when WrappedMTLBinaryArchive exists + // GETWRAPPEDNSARRAY(BinaryArchive, binaryArchives); +} + +ComputePipelineDescriptor::operator MTL::ComputePipelineDescriptor *() +{ + MTL::ComputePipelineDescriptor *objc = MTL::ComputePipelineDescriptor::alloc()->init(); + if(label.length() > 0) + { + objc->setLabel(NS::String::string(label.data(), NS::UTF8StringEncoding)); + } + objc->setComputeFunction(Unwrap(computeFunction)); + objc->setThreadGroupSizeIsMultipleOfThreadExecutionWidth(threadGroupSizeIsMultipleOfThreadExecution); + objc->setMaxTotalThreadsPerThreadgroup(maxTotalThreadsPerThreadgroup); + objc->setMaxCallStackDepth(maxCallStackDepth); + stageInputDescriptor.CopyTo(objc->stageInputDescriptor()); + objc->setSupportIndirectCommandBuffers(supportIndirectCommandBuffers); + linkedFunctions.CopyTo(objc->linkedFunctions()); + objc->setSupportAddingBinaryFunctions(supportAddingBinaryFunctions); + COPYTOOBJCARRAY(PipelineBufferDescriptor, buffers); + // TODO: when WrappedMTLDynamicLibrary exists + // objc->setPreloadedLibraries(CreateUnwrappedNSArray(preloadedLibraries)); + // Deprecated + // objc->setInsertLibraries(CreateUnwrappedNSArray(insertLibraries)); + // objc->setLinkedFunctions(CreateUnwrappedNSArray(linkedFunctions)); + // TODO: when WrappedMTLBinaryArchive exists + // objc->setBinaryArchives(CreateUnwrappedNSArray(binaryArchives)); + // GETWRAPPEDNSARRAY(BinaryArchive, binaryArchives); + return objc; +} + } // namespace RDMTL diff --git a/renderdoc/driver/metal/metal_types.h b/renderdoc/driver/metal/metal_types.h index 5bbde00cc..95d6d6cb0 100644 --- a/renderdoc/driver/metal/metal_types.h +++ b/renderdoc/driver/metal/metal_types.h @@ -487,6 +487,31 @@ struct ComputePassSampleBufferAttachmentDescriptor NS::UInteger endOfEncoderSampleIndex = MTLCounterDontSample; }; +// MTLComputePipelineDescriptor : based on the interface defined in +// Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/System/Library/Frameworks/Metal.framework/Headers/MTLComputePipeline.h +struct ComputePipelineDescriptor +{ + ComputePipelineDescriptor() = default; + ComputePipelineDescriptor(MTL::ComputePipelineDescriptor *objc); + explicit operator MTL::ComputePipelineDescriptor *(); + rdcstr label; + WrappedMTLFunction *computeFunction = NULL; + bool threadGroupSizeIsMultipleOfThreadExecution = false; + NS::UInteger maxTotalThreadsPerThreadgroup = 0; + NS::UInteger maxCallStackDepth = 1; + StageInputOutputDescriptor stageInputDescriptor; + rdcarray buffers; + bool supportIndirectCommandBuffers = false; + // TODO: when WrappedMTLDynamicLibrary exists + // rdcarray preloadedLibraries; + // Deprecated + // rdcarray insertLibraries; + RDMTL::LinkedFunctions linkedFunctions; + bool supportAddingBinaryFunctions = false; + // TODO: when WrappedMTLBinaryArchive exists + // rdcarray binaryArchives; +}; + } // namespace RDMTL template <> @@ -525,3 +550,4 @@ RDMTL_DECLARE_REFLECTION_STRUCT(RenderPassStencilAttachmentDescriptor); RDMTL_DECLARE_REFLECTION_STRUCT(RenderPassSampleBufferAttachmentDescriptor); RDMTL_DECLARE_REFLECTION_STRUCT(RenderPassDescriptor); RDMTL_DECLARE_REFLECTION_STRUCT(ComputePassSampleBufferAttachmentDescriptor); +RDMTL_DECLARE_REFLECTION_STRUCT(ComputePipelineDescriptor);