diff --git a/renderdoc/driver/metal/CMakeLists.txt b/renderdoc/driver/metal/CMakeLists.txt index 1a41923e3..9cd48d67c 100644 --- a/renderdoc/driver/metal/CMakeLists.txt +++ b/renderdoc/driver/metal/CMakeLists.txt @@ -9,7 +9,6 @@ set(sources metal_device_bridge.mm metal_resources.cpp metal_resources.h - metal_types_bridge.mm metal_types_bridge.h metal_types.cpp metal_types.h diff --git a/renderdoc/driver/metal/metal_command_buffer.cpp b/renderdoc/driver/metal/metal_command_buffer.cpp index 48f9cb2cd..482649eb5 100644 --- a/renderdoc/driver/metal/metal_command_buffer.cpp +++ b/renderdoc/driver/metal/metal_command_buffer.cpp @@ -31,7 +31,7 @@ WrappedMTLCommandBuffer::WrappedMTLCommandBuffer(MTL::CommandBuffer *realMTLComm ResourceId objId, WrappedMTLDevice *wrappedMTLDevice) : WrappedMTLObject(realMTLCommandBuffer, objId, wrappedMTLDevice, wrappedMTLDevice->GetStateRef()) { - m_ObjcBridge = AllocateObjCBridge(this); + AllocateObjCBridge(this); } template @@ -105,7 +105,7 @@ void WrappedMTLCommandBuffer::commit() if(capframe) { bufferRecord->AddRef(); - bufferRecord->MarkResourceFrameReferenced(GetResID(m_WrappedMTLCommandQueue), eFrameRef_Read); + bufferRecord->MarkResourceFrameReferenced(GetResID(m_CommandQueue), eFrameRef_Read); // pull in frame refs from this command buffer bufferRecord->AddResourceReferences(GetResourceManager()); } diff --git a/renderdoc/driver/metal/metal_command_buffer.h b/renderdoc/driver/metal/metal_command_buffer.h index ae7345157..2706c0e47 100644 --- a/renderdoc/driver/metal/metal_command_buffer.h +++ b/renderdoc/driver/metal/metal_command_buffer.h @@ -35,16 +35,8 @@ public: WrappedMTLCommandBuffer(MTL::CommandBuffer *realMTLCommandBuffer, ResourceId objId, WrappedMTLDevice *wrappedMTLDevice); - void SetWrappedMTLCommandQueue(WrappedMTLCommandQueue *wrappedMTLCommandQueue) - { - m_WrappedMTLCommandQueue = wrappedMTLCommandQueue; - } - - MTL::CommandQueue *GetObjCBridgeMTLCommandQueue() - { - return GetObjCBridge(m_WrappedMTLCommandQueue); - } - + void SetCommandQueue(WrappedMTLCommandQueue *commandQueue) { m_CommandQueue = commandQueue; } + MTL::CommandQueue *GetCommandQueue() { return (MTL::CommandQueue *)m_CommandQueue; } DECLARE_FUNCTION_SERIALISED(void, presentDrawable, MTL::Drawable *drawable); DECLARE_FUNCTION_SERIALISED(void, commit); @@ -54,5 +46,5 @@ public: }; private: - WrappedMTLCommandQueue *m_WrappedMTLCommandQueue; + WrappedMTLCommandQueue *m_CommandQueue; }; diff --git a/renderdoc/driver/metal/metal_command_buffer_bridge.mm b/renderdoc/driver/metal/metal_command_buffer_bridge.mm index 75611ede3..e151c6f63 100644 --- a/renderdoc/driver/metal/metal_command_buffer_bridge.mm +++ b/renderdoc/driver/metal/metal_command_buffer_bridge.mm @@ -31,14 +31,18 @@ // ObjCBridgeMTLCommandBuffer specific - (id)real { - return id(Unwrap(self.wrappedCPP)); + return id(Unwrap(GetWrapped(self))); } +// Silence compiler warning +// error: method possibly missing a [super dealloc] call [-Werror,-Wobjc-missing-super-calls] +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" - (void)dealloc { - self.wrappedCPP->Dealloc(); - [super dealloc]; + GetWrapped(self)->Dealloc(); } +#pragma clang diagnostic pop // Use the real MTLCommandBuffer to find methods from messages - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector @@ -63,12 +67,12 @@ - (id)device { - return id(self.wrappedCPP->GetObjCBridgeMTLDevice()); + return id(GetWrapped(self)->GetDevice()); } - (id)commandQueue { - return id(self.wrappedCPP->GetObjCBridgeMTLCommandQueue()); + return id(GetWrapped(self)->GetCommandQueue()); } - (BOOL)retainedReferences @@ -124,7 +128,7 @@ - (void)commit { - self.wrappedCPP->commit(); + GetWrapped(self)->commit(); } - (void)addScheduledHandler:(MTLCommandBufferHandler)block @@ -135,7 +139,7 @@ - (void)presentDrawable:(id)drawable { - self.wrappedCPP->presentDrawable((MTL::Drawable *)drawable); + GetWrapped(self)->presentDrawable((MTL::Drawable *)drawable); } - (void)presentDrawable:(id)drawable atTime:(CFTimeInterval)presentationTime diff --git a/renderdoc/driver/metal/metal_command_queue.cpp b/renderdoc/driver/metal/metal_command_queue.cpp index c04af2f59..6d16240ba 100644 --- a/renderdoc/driver/metal/metal_command_queue.cpp +++ b/renderdoc/driver/metal/metal_command_queue.cpp @@ -30,7 +30,7 @@ WrappedMTLCommandQueue::WrappedMTLCommandQueue(MTL::CommandQueue *realMTLCommand ResourceId objId, WrappedMTLDevice *wrappedMTLDevice) : WrappedMTLObject(realMTLCommandQueue, objId, wrappedMTLDevice, wrappedMTLDevice->GetStateRef()) { - m_ObjcBridge = AllocateObjCBridge(this); + AllocateObjCBridge(this); } template @@ -55,7 +55,7 @@ WrappedMTLCommandBuffer *WrappedMTLCommandQueue::commandBuffer() SERIALISE_TIME_CALL(realMTLCommandBuffer = Unwrap(this)->commandBuffer()); WrappedMTLCommandBuffer *wrappedMTLCommandBuffer; ResourceId id = GetResourceManager()->WrapResource(realMTLCommandBuffer, wrappedMTLCommandBuffer); - wrappedMTLCommandBuffer->SetWrappedMTLCommandQueue(this); + wrappedMTLCommandBuffer->SetCommandQueue(this); if(IsCaptureMode(m_State)) { diff --git a/renderdoc/driver/metal/metal_command_queue_bridge.mm b/renderdoc/driver/metal/metal_command_queue_bridge.mm index d9505621c..a3f5fc4b3 100644 --- a/renderdoc/driver/metal/metal_command_queue_bridge.mm +++ b/renderdoc/driver/metal/metal_command_queue_bridge.mm @@ -31,14 +31,18 @@ // ObjCBridgeMTLCommandQueue specific - (id)real { - return id(Unwrap(self.wrappedCPP)); + return id(Unwrap(GetWrapped(self))); } +// Silence compiler warning +// error: method possibly missing a [super dealloc] call [-Werror,-Wobjc-missing-super-calls] +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" - (void)dealloc { - self.wrappedCPP->Dealloc(); - [super dealloc]; + GetWrapped(self)->Dealloc(); } +#pragma clang diagnostic pop // Use the real MTLCommandQueue to find methods from messages - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector @@ -73,12 +77,12 @@ - (id)device { - return id(self.wrappedCPP->GetObjCBridgeMTLDevice()); + return id(GetWrapped(self)->GetDevice()); } - (nullable id)commandBuffer { - return id(GetObjCBridge(self.wrappedCPP->commandBuffer())); + return id(GetWrapped(self)->commandBuffer()); } - (nullable id)commandBufferWithDescriptor:(MTLCommandBufferDescriptor *)descriptor diff --git a/renderdoc/driver/metal/metal_common.h b/renderdoc/driver/metal/metal_common.h index fd257de65..bd48af550 100644 --- a/renderdoc/driver/metal/metal_common.h +++ b/renderdoc/driver/metal/metal_common.h @@ -109,11 +109,11 @@ enum class MetalChunk : uint32_t DECLARE_REFLECTION_ENUM(MetalChunk); // must be at the start of any function that serialises -#define CACHE_THREAD_SERIALISER() WriteSerialiser &ser = m_WrappedMTLDevice->GetThreadSerialiser(); +#define CACHE_THREAD_SERIALISER() WriteSerialiser &ser = m_Device->GetThreadSerialiser(); #define SERIALISE_TIME_CALL(...) \ { \ - WriteSerialiser &ser = m_WrappedMTLDevice->GetThreadSerialiser(); \ + WriteSerialiser &ser = m_Device->GetThreadSerialiser(); \ ser.ChunkMetadata().timestampMicro = Timing::GetTick(); \ __VA_ARGS__; \ ser.ChunkMetadata().durationMicro = Timing::GetTick() - ser.ChunkMetadata().timestampMicro; \ @@ -142,7 +142,7 @@ DECLARE_REFLECTION_ENUM(MetalChunk); // path at compile-time, and the second because we might be just struct-serialising in which case we // should be doing no work to restore states. // Writing is unambiguously during capture mode, so we don't have to check both in that case. -#define IsReplayingAndReading() (ser.IsReading() && IsReplayMode(m_WrappedMTLDevice->GetState())) +#define IsReplayingAndReading() (ser.IsReading() && IsReplayMode(m_Device->GetState())) #ifdef __OBJC__ #define METAL_NOT_HOOKED() \ diff --git a/renderdoc/driver/metal/metal_device.cpp b/renderdoc/driver/metal/metal_device.cpp index 3b2f300b8..1b911e655 100644 --- a/renderdoc/driver/metal/metal_device.cpp +++ b/renderdoc/driver/metal/metal_device.cpp @@ -31,12 +31,12 @@ WrappedMTLDevice::WrappedMTLDevice(MTL::Device *realMTLDevice, ResourceId objId) : WrappedMTLObject(realMTLDevice, objId, this, GetStateRef()) { - m_ObjcBridge = AllocateObjCBridge(this); - m_WrappedMTLDevice = this; + AllocateObjCBridge(this); + m_Device = this; threadSerialiserTLSSlot = Threading::AllocateTLSSlot(); m_ResourceManager = new MetalResourceManager(m_State, this); - RDCASSERT(m_WrappedMTLDevice == this); + RDCASSERT(m_Device == this); GetResourceManager()->AddCurrentResource(objId, this); } diff --git a/renderdoc/driver/metal/metal_device_bridge.mm b/renderdoc/driver/metal/metal_device_bridge.mm index 953a93dd3..abe0aa475 100644 --- a/renderdoc/driver/metal/metal_device_bridge.mm +++ b/renderdoc/driver/metal/metal_device_bridge.mm @@ -34,14 +34,18 @@ // ObjCBridgeMTLDevice specific - (id)real { - return id(Unwrap(self.wrappedCPP)); + return id(Unwrap(GetWrapped(self))); } +// Silence compiler warning +// error: method possibly missing a [super dealloc] call [-Werror,-Wobjc-missing-super-calls] +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" - (void)dealloc { - self.wrappedCPP->Dealloc(); - [super dealloc]; + GetWrapped(self)->Dealloc(); } +#pragma clang diagnostic pop // Use the real MTLDevice to find methods from messages - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector @@ -123,37 +127,37 @@ - (BOOL)isDepth24Stencil8PixelFormatSupported API_AVAILABLE(macos(10.11), macCatalyst(13.0)) API_UNAVAILABLE(ios) { - return self.wrappedCPP->isDepth24Stencil8PixelFormatSupported(); + return GetWrapped(self)->isDepth24Stencil8PixelFormatSupported(); } - (MTLReadWriteTextureTier)readWriteTextureSupport API_AVAILABLE(macos(10.13), ios(11.0)) { - return (MTLReadWriteTextureTier)self.wrappedCPP->readWriteTextureSupport(); + return (MTLReadWriteTextureTier)GetWrapped(self)->readWriteTextureSupport(); } - (MTLArgumentBuffersTier)argumentBuffersSupport API_AVAILABLE(macos(10.13), ios(11.0)) { - return (MTLArgumentBuffersTier)self.wrappedCPP->argumentBuffersSupport(); + return (MTLArgumentBuffersTier)GetWrapped(self)->argumentBuffersSupport(); } - (BOOL)areRasterOrderGroupsSupported API_AVAILABLE(macos(10.13), ios(11.0)) { - return self.wrappedCPP->areRasterOrderGroupsSupported(); + return GetWrapped(self)->areRasterOrderGroupsSupported(); } - (BOOL)supports32BitFloatFiltering API_AVAILABLE(macos(11.0), ios(14.0)) { - return self.wrappedCPP->supports32BitFloatFiltering(); + return GetWrapped(self)->supports32BitFloatFiltering(); } - (BOOL)supports32BitMSAA API_AVAILABLE(macos(11.0), ios(14.0)) { - return self.wrappedCPP->supports32BitMSAA(); + return GetWrapped(self)->supports32BitMSAA(); } - (BOOL)supportsQueryTextureLOD API_AVAILABLE(macos(11.0), ios(14.0)) { - return self.wrappedCPP->supportsQueryTextureLOD(); + return GetWrapped(self)->supportsQueryTextureLOD(); } - (BOOL)supportsBCTextureCompression API_AVAILABLE(macos(11.0)) @@ -162,21 +166,21 @@ API_UNAVAILABLE(ios) #endif // #if __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_12_0 { - return self.wrappedCPP->supportsBCTextureCompression(); + return GetWrapped(self)->supportsBCTextureCompression(); } - (BOOL)supportsPullModelInterpolation API_AVAILABLE(macos(11.0), ios(14.0)) { - return self.wrappedCPP->supportsPullModelInterpolation(); + return GetWrapped(self)->supportsPullModelInterpolation(); } - (BOOL)areBarycentricCoordsSupported API_AVAILABLE(macos(10.15))API_UNAVAILABLE(ios) { - return self.wrappedCPP->areBarycentricCoordsSupported(); + return GetWrapped(self)->areBarycentricCoordsSupported(); } - (BOOL)supportsShaderBarycentricCoordinates API_AVAILABLE(macos(10.15))API_UNAVAILABLE(ios) { - return self.wrappedCPP->supportsShaderBarycentricCoordinates(); + return GetWrapped(self)->supportsShaderBarycentricCoordinates(); } - (NSUInteger)currentAllocatedSize API_AVAILABLE(macos(10.13), ios(11.0)) @@ -186,7 +190,7 @@ - (nullable id)newCommandQueue { - return id(GetObjCBridge(self.wrappedCPP->newCommandQueue())); + return id(GetWrapped(self)->newCommandQueue()); } - (nullable id)newCommandQueueWithMaxCommandBufferCount:(NSUInteger)maxCommandBufferCount @@ -288,7 +292,7 @@ - (nullable id)newDefaultLibrary { - return id(GetObjCBridge(self.wrappedCPP->newDefaultLibrary())); + return id(GetWrapped(self)->newDefaultLibrary()); } - (nullable id)newDefaultLibraryWithBundle:(NSBundle *)bundle @@ -325,8 +329,8 @@ options:(nullable MTLCompileOptions *)options error:(__autoreleasing NSError **)error { - return (id)(GetObjCBridge(self.wrappedCPP->newLibraryWithSource( - (NS::String *)source, (MTL::CompileOptions *)options, (NS::Error **)error))); + return (id)(GetWrapped(self)->newLibraryWithSource( + (NS::String *)source, (MTL::CompileOptions *)options, (NS::Error **)error)); } - (void)newLibraryWithSource:(NSString *)source @@ -472,17 +476,17 @@ newComputePipelineStateWithDescriptor:(MTLComputePipelineDescriptor *)descriptor - (BOOL)supportsFeatureSet:(MTLFeatureSet)featureSet { - return self.wrappedCPP->supportsFeatureSet((MTL::FeatureSet)featureSet); + return GetWrapped(self)->supportsFeatureSet((MTL::FeatureSet)featureSet); } - (BOOL)supportsFamily:(MTLGPUFamily)gpuFamily API_AVAILABLE(macos(10.15), ios(13.0)) { - return self.wrappedCPP->supportsFamily((MTL::GPUFamily)gpuFamily); + return GetWrapped(self)->supportsFamily((MTL::GPUFamily)gpuFamily); } - (BOOL)supportsTextureSampleCount:(NSUInteger)sampleCount API_AVAILABLE(macos(10.11), ios(9.0)) { - return self.wrappedCPP->supportsTextureSampleCount(sampleCount); + return GetWrapped(self)->supportsTextureSampleCount(sampleCount); } - (NSUInteger)minimumLinearTextureAlignmentForPixelFormat:(MTLPixelFormat)format @@ -537,7 +541,7 @@ newRenderPipelineStateWithTileDescriptor:(MTLTileRenderPipelineDescriptor *)desc - (BOOL)areProgrammableSamplePositionsSupported API_AVAILABLE(macos(10.13), ios(11.0)) { - return self.wrappedCPP->areProgrammableSamplePositionsSupported(); + return GetWrapped(self)->areProgrammableSamplePositionsSupported(); } - (void)getDefaultSamplePositions:(MTLSamplePosition *)positions @@ -557,7 +561,7 @@ newRenderPipelineStateWithTileDescriptor:(MTLTileRenderPipelineDescriptor *)desc - (BOOL)supportsRasterizationRateMapWithLayerCount:(NSUInteger)layerCount API_AVAILABLE(macos(10.15.4), ios(13.0), macCatalyst(13.4)) { - return self.wrappedCPP->supportsRasterizationRateMapWithLayerCount(layerCount); + return GetWrapped(self)->supportsRasterizationRateMapWithLayerCount(layerCount); } - (nullable id)newRasterizationRateMapWithDescriptor: @@ -687,24 +691,24 @@ newIndirectCommandBufferWithDescriptor:(MTLIndirectCommandBufferDescriptor *)des - (BOOL)supportsCounterSampling:(MTLCounterSamplingPoint)samplingPoint API_AVAILABLE(macos(11.0), ios(14.0)) { - return self.wrappedCPP->supportsCounterSampling((MTL::CounterSamplingPoint)samplingPoint); + return GetWrapped(self)->supportsCounterSampling((MTL::CounterSamplingPoint)samplingPoint); } - (BOOL)supportsVertexAmplificationCount:(NSUInteger)count API_AVAILABLE(macos(10.15.4), ios(13.0), macCatalyst(13.4)) { - return self.wrappedCPP->supportsVertexAmplificationCount(count); + return GetWrapped(self)->supportsVertexAmplificationCount(count); } - (BOOL)supportsDynamicLibraries API_AVAILABLE(macos(11.0), ios(14.0)) { - return self.wrappedCPP->supportsDynamicLibraries(); + return GetWrapped(self)->supportsDynamicLibraries(); } #if __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_12_0 - (BOOL)supportsRenderDynamicLibraries API_AVAILABLE(macos(12.0), ios(15.0)) { - return self.wrappedCPP->supportsRenderDynamicLibraries(); + return GetWrapped(self)->supportsRenderDynamicLibraries(); } #endif @@ -734,7 +738,7 @@ newIndirectCommandBufferWithDescriptor:(MTLIndirectCommandBufferDescriptor *)des - (BOOL)supportsRaytracing API_AVAILABLE(macos(11.0), ios(14.0)) { - return self.wrappedCPP->supportsRaytracing(); + return GetWrapped(self)->supportsRaytracing(); } - (MTLAccelerationStructureSizes)accelerationStructureSizesWithDescriptor: @@ -760,20 +764,20 @@ newIndirectCommandBufferWithDescriptor:(MTLIndirectCommandBufferDescriptor *)des - (BOOL)supportsFunctionPointers API_AVAILABLE(macos(11.0), ios(14.0)) { - return self.wrappedCPP->supportsFunctionPointers(); + return GetWrapped(self)->supportsFunctionPointers(); } #if __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_12_0 - (BOOL)supportsFunctionPointersFromRender API_AVAILABLE(macos(12.0), ios(15.0)) { - return self.wrappedCPP->supportsFunctionPointersFromRender(); + return GetWrapped(self)->supportsFunctionPointersFromRender(); } #endif #if __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_12_0 - (BOOL)supportsRaytracingFromRender API_AVAILABLE(macos(12.0), ios(15.0)) { - return self.wrappedCPP->supportsRaytracingFromRender(); + return GetWrapped(self)->supportsRaytracingFromRender(); } #endif @@ -782,7 +786,7 @@ newIndirectCommandBufferWithDescriptor:(MTLIndirectCommandBufferDescriptor *)des #if __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_12_0 - (BOOL)supportsPrimitiveMotionBlur API_AVAILABLE(macos(11.0), ios(14.0)) { - return self.wrappedCPP->supportsPrimitiveMotionBlur(); + return GetWrapped(self)->supportsPrimitiveMotionBlur(); } #endif diff --git a/renderdoc/driver/metal/metal_function.cpp b/renderdoc/driver/metal/metal_function.cpp index be5f68756..61d7f94e3 100644 --- a/renderdoc/driver/metal/metal_function.cpp +++ b/renderdoc/driver/metal/metal_function.cpp @@ -29,5 +29,5 @@ WrappedMTLFunction::WrappedMTLFunction(MTL::Function *realMTLFunction, ResourceI WrappedMTLDevice *wrappedMTLDevice) : WrappedMTLObject(realMTLFunction, objId, wrappedMTLDevice, wrappedMTLDevice->GetStateRef()) { - m_ObjcBridge = AllocateObjCBridge(this); + AllocateObjCBridge(this); } diff --git a/renderdoc/driver/metal/metal_function_bridge.mm b/renderdoc/driver/metal/metal_function_bridge.mm index ebf9fd1ec..cc593d5c7 100644 --- a/renderdoc/driver/metal/metal_function_bridge.mm +++ b/renderdoc/driver/metal/metal_function_bridge.mm @@ -31,14 +31,18 @@ // ObjCBrdigeMTLFunction specific - (id)real { - return id(Unwrap(self.wrappedCPP)); + return id(Unwrap(GetWrapped(self))); } +// Silence compiler warning +// error: method possibly missing a [super dealloc] call [-Werror,-Wobjc-missing-super-calls] +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" - (void)dealloc { - self.wrappedCPP->Dealloc(); - [super dealloc]; + GetWrapped(self)->Dealloc(); } +#pragma clang diagnostic pop // Use the real MTLFunction to find methods from messages - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector @@ -73,7 +77,7 @@ - (id)device { - return id(self.wrappedCPP->GetObjCBridgeMTLDevice()); + return id(GetWrapped(self)->GetDevice()); } - (MTLFunctionType)functionType diff --git a/renderdoc/driver/metal/metal_hook_bridge.mm b/renderdoc/driver/metal/metal_hook_bridge.mm index 1252f4fe9..dc133cd92 100644 --- a/renderdoc/driver/metal/metal_hook_bridge.mm +++ b/renderdoc/driver/metal/metal_hook_bridge.mm @@ -54,8 +54,7 @@ id METAL_EXPORT_NAME(MTLCreateSystemDefaultDevice)(void) } id device = METAL.MTLCreateSystemDefaultDevice(); - return id( - GetObjCBridge(WrappedMTLDevice::MTLCreateSystemDefaultDevice((MTL::Device *)device))); + return id(WrappedMTLDevice::MTLCreateSystemDefaultDevice((MTL::Device *)device)); } /* diff --git a/renderdoc/driver/metal/metal_library.cpp b/renderdoc/driver/metal/metal_library.cpp index e3b33559c..10454b065 100644 --- a/renderdoc/driver/metal/metal_library.cpp +++ b/renderdoc/driver/metal/metal_library.cpp @@ -30,7 +30,7 @@ WrappedMTLLibrary::WrappedMTLLibrary(MTL::Library *realMTLLibrary, ResourceId ob WrappedMTLDevice *wrappedMTLDevice) : WrappedMTLObject(realMTLLibrary, objId, wrappedMTLDevice, wrappedMTLDevice->GetStateRef()) { - m_ObjcBridge = AllocateObjCBridge(this); + AllocateObjCBridge(this); } template diff --git a/renderdoc/driver/metal/metal_library_bridge.mm b/renderdoc/driver/metal/metal_library_bridge.mm index 4ed1315b1..eb38c3159 100644 --- a/renderdoc/driver/metal/metal_library_bridge.mm +++ b/renderdoc/driver/metal/metal_library_bridge.mm @@ -31,14 +31,18 @@ // ObjCBridgeMTLLibrary specific - (id)real { - return id(Unwrap(self.wrappedCPP)); + return id(Unwrap(GetWrapped(self))); } +// Silence compiler warning +// error: method possibly missing a [super dealloc] call [-Werror,-Wobjc-missing-super-calls] +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" - (void)dealloc { - self.wrappedCPP->Dealloc(); - [super dealloc]; + GetWrapped(self)->Dealloc(); } +#pragma clang diagnostic pop // Use the real MTLLibrary to find methods from messages - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector @@ -73,13 +77,12 @@ - (id)device { - return id(self.wrappedCPP->GetObjCBridgeMTLDevice()); + return id(GetWrapped(self)->GetDevice()); } - (nullable id)newFunctionWithName:(NSString *)functionName { - return id( - GetObjCBridge(self.wrappedCPP->newFunctionWithName((NS::String *)functionName))); + return id(GetWrapped(self)->newFunctionWithName((NS::String *)functionName)); } - (nullable id)newFunctionWithName:(NSString *)name diff --git a/renderdoc/driver/metal/metal_manager.cpp b/renderdoc/driver/metal/metal_manager.cpp index a5094ae3d..0a4ec3426 100644 --- a/renderdoc/driver/metal/metal_manager.cpp +++ b/renderdoc/driver/metal/metal_manager.cpp @@ -33,28 +33,28 @@ bool MetalResourceManager::ResourceTypeRelease(WrappedResourceType res) bool MetalResourceManager::Prepare_InitialState(WrappedMTLObject *res) { - return m_WrappedMTLDevice->Prepare_InitialState(res); + return m_Device->Prepare_InitialState(res); } uint64_t MetalResourceManager::GetSize_InitialState(ResourceId id, const MetalInitialContents &initial) { - return m_WrappedMTLDevice->GetSize_InitialState(id, initial); + return m_Device->GetSize_InitialState(id, initial); } bool MetalResourceManager::Serialise_InitialState(WriteSerialiser &ser, ResourceId id, MetalResourceRecord *record, const MetalInitialContents *initial) { - return m_WrappedMTLDevice->Serialise_InitialState(ser, id, record, initial); + return m_Device->Serialise_InitialState(ser, id, record, initial); } void MetalResourceManager::Create_InitialState(ResourceId id, WrappedMTLObject *live, bool hasData) { - return m_WrappedMTLDevice->Create_InitialState(id, live, hasData); + return m_Device->Create_InitialState(id, live, hasData); } void MetalResourceManager::Apply_InitialState(WrappedMTLObject *live, const MetalInitialContents &initial) { - return m_WrappedMTLDevice->Apply_InitialState(live, initial); + return m_Device->Apply_InitialState(live, initial); } diff --git a/renderdoc/driver/metal/metal_manager.h b/renderdoc/driver/metal/metal_manager.h index d3c77b8a4..3f0326572 100644 --- a/renderdoc/driver/metal/metal_manager.h +++ b/renderdoc/driver/metal/metal_manager.h @@ -65,7 +65,7 @@ class MetalResourceManager : public ResourceManager::Outer *&wrapped) { RDCASSERT(obj != NULL); - RDCASSERT(m_WrappedMTLDevice != NULL); + RDCASSERT(m_Device != NULL); ResourceId id = ResourceIDGen::GetNewUniqueID(); using WrappedType = typename UnwrapHelper::Outer; - wrapped = new WrappedType(obj, id, m_WrappedMTLDevice); + wrapped = new WrappedType(obj, id, m_Device); wrapped->m_Real = obj; AddCurrentResource(id, wrapped); @@ -147,5 +147,5 @@ private: void Apply_InitialState(WrappedMTLObject *live, const MetalInitialContents &initial); // ResourceManager interface - WrappedMTLDevice *m_WrappedMTLDevice; + WrappedMTLDevice *m_Device; }; diff --git a/renderdoc/driver/metal/metal_resources.cpp b/renderdoc/driver/metal/metal_resources.cpp index fcc24d80c..c7ba6e71a 100644 --- a/renderdoc/driver/metal/metal_resources.cpp +++ b/renderdoc/driver/metal/metal_resources.cpp @@ -37,13 +37,8 @@ ResourceId GetResID(WrappedMTLObject *obj) return obj->m_ID; } -#define IMPLEMENT_WRAPPED_TYPE_HELPERS(CPPTYPE) \ - MTL::CPPTYPE *Unwrap(WrappedMTL##CPPTYPE *obj) { return Unwrap(obj); } \ - MTL::CPPTYPE *GetObjCBridge(WrappedMTL##CPPTYPE *obj) \ - { \ - return GetObjCBridge(obj); \ - } - +#define IMPLEMENT_WRAPPED_TYPE_HELPERS(CPPTYPE) \ + MTL::CPPTYPE *Unwrap(WrappedMTL##CPPTYPE *obj) { return Unwrap(obj); } METALCPP_WRAPPED_PROTOCOLS(IMPLEMENT_WRAPPED_TYPE_HELPERS) #undef IMPLEMENT_WRAPPED_TYPE_HELPERS @@ -54,12 +49,7 @@ void WrappedMTLObject::Dealloc() MetalResourceManager *WrappedMTLObject::GetResourceManager() { - return m_WrappedMTLDevice->GetResourceManager(); -} - -MTL::Device *WrappedMTLObject::GetObjCBridgeMTLDevice() -{ - return GetObjCBridge(m_WrappedMTLDevice); + return m_Device->GetResourceManager(); } MetalResourceRecord::~MetalResourceRecord() diff --git a/renderdoc/driver/metal/metal_resources.h b/renderdoc/driver/metal/metal_resources.h index 0a70d15c3..104a289d9 100644 --- a/renderdoc/driver/metal/metal_resources.h +++ b/renderdoc/driver/metal/metal_resources.h @@ -48,36 +48,26 @@ struct WrappedMTLObject { WrappedMTLObject() = delete; WrappedMTLObject(WrappedMTLDevice *wrappedMTLDevice, CaptureState &captureState) - : m_ObjcBridge(NULL), - m_Real(NULL), - m_Record(NULL), - m_WrappedMTLDevice(wrappedMTLDevice), - m_State(captureState) + : m_Real(NULL), m_Device(wrappedMTLDevice), m_State(captureState) { } WrappedMTLObject(void *mtlObject, ResourceId objId, WrappedMTLDevice *wrappedMTLDevice, CaptureState &captureState) - : m_ObjcBridge(NULL), - m_Real(mtlObject), - m_ID(objId), - m_Record(NULL), - m_WrappedMTLDevice(wrappedMTLDevice), - m_State(captureState) + : m_Real(mtlObject), m_ID(objId), m_Device(wrappedMTLDevice), m_State(captureState) { } ~WrappedMTLObject() = default; void Dealloc(); - MTL::Device *GetObjCBridgeMTLDevice(); - + MTL::Device *GetDevice() { return (MTL::Device *)m_Device; } MetalResourceManager *GetResourceManager(); - void *m_ObjcBridge; + void *m_ObjcBridge = NULL; void *m_Real; ResourceId m_ID; - MetalResourceRecord *m_Record; - WrappedMTLDevice *m_WrappedMTLDevice; + MetalResourceRecord *m_Record = NULL; + WrappedMTLDevice *m_Device; CaptureState &m_State; }; @@ -101,29 +91,19 @@ RealType Unwrap(WrappedMTLObject *obj) return (RealType)obj->m_Real; } -template -RealType GetObjCBridge(WrappedMTLObject *obj) -{ - if(obj == NULL) - return RealType(); - - return (RealType)obj->m_ObjcBridge; -} - // template magic voodoo to unwrap types template struct UnwrapHelper { }; -#define WRAPPED_TYPE_HELPERS(CPPTYPE) \ - template <> \ - struct UnwrapHelper \ - { \ - typedef CONCAT(WrappedMTL, CPPTYPE) Outer; \ - }; \ - extern MTL::CPPTYPE *Unwrap(WrappedMTL##CPPTYPE *obj); \ - extern MTL::CPPTYPE *GetObjCBridge(WrappedMTL##CPPTYPE *obj); +#define WRAPPED_TYPE_HELPERS(CPPTYPE) \ + template <> \ + struct UnwrapHelper \ + { \ + typedef CONCAT(WrappedMTL, CPPTYPE) Outer; \ + }; \ + extern MTL::CPPTYPE *Unwrap(WrappedMTL##CPPTYPE *obj); METALCPP_WRAPPED_PROTOCOLS(WRAPPED_TYPE_HELPERS) #undef WRAPPED_TYPE_HELPERS diff --git a/renderdoc/driver/metal/metal_types.cpp b/renderdoc/driver/metal/metal_types.cpp index 5c4bf9def..502a98dca 100644 --- a/renderdoc/driver/metal/metal_types.cpp +++ b/renderdoc/driver/metal/metal_types.cpp @@ -35,6 +35,32 @@ RDCCOMPILE_ASSERT(sizeof(NS::Integer) == sizeof(std::intptr_t), "NS::Integer siz RDCCOMPILE_ASSERT(sizeof(NS::UInteger) == sizeof(std::uintptr_t), "NS::UInteger size does not match"); +#define DEFINE_OBJC_HELPERS(CPPTYPE) \ + void AllocateObjCBridge(WrappedMTL##CPPTYPE *wrappedCPP) \ + { \ + RDCCOMPILE_ASSERT((offsetof(WrappedMTL##CPPTYPE, m_ObjcBridge) == 0), \ + "m_ObjcBridge must be at offsetof 0"); \ + const char *const className = "ObjCBridgeMTL" #CPPTYPE; \ + static Class klass = objc_lookUpClass(className); \ + static size_t classSize = class_getInstanceSize(klass); \ + if(classSize != sizeof(wrappedCPP->m_ObjcBridge)) \ + { \ + RDCFATAL("'%s' classSize != sizeof(m_ObjcBridge) %lu != %lu", className, classSize, \ + sizeof(wrappedCPP->m_ObjcBridge)); \ + } \ + wrappedCPP->m_ObjcBridge = klass; \ + MTL::CPPTYPE *real = (MTL::CPPTYPE *)wrappedCPP->m_Real; \ + if(real) \ + { \ + id objc = (id)&wrappedCPP->m_ObjcBridge; \ + objc_setAssociatedObject((id)real, objc, objc, OBJC_ASSOCIATION_RETAIN); \ + ((MTL::CPPTYPE *)objc)->release(); \ + } \ + } + +METALCPP_WRAPPED_PROTOCOLS(DEFINE_OBJC_HELPERS) +#undef DEFINE_OBJC_HELPERS + // serialisation of object handles via IDs. template void DoSerialiseViaResourceId(SerialiserType &ser, type &el) diff --git a/renderdoc/driver/metal/metal_types.h b/renderdoc/driver/metal/metal_types.h index 9c69478eb..bac33ef46 100644 --- a/renderdoc/driver/metal/metal_types.h +++ b/renderdoc/driver/metal/metal_types.h @@ -50,13 +50,13 @@ METALCPP_WRAPPED_PROTOCOLS(DECLARE_WRAPPED_TYPE_SERIALISE); #undef DECLARE_WRAPPED_TYPE_SERIALISE -#define DECLARE_OBJC_HELPERS(CPPTYPE) \ - class WrappedMTL##CPPTYPE; \ - extern WrappedMTL##CPPTYPE *GetWrapped(MTL::CPPTYPE *objCWrapped); \ - extern MTL::CPPTYPE *GetReal(MTL::CPPTYPE *objCWrapped); \ - extern bool IsObjCBridge(MTL::CPPTYPE *objCWrapped); \ - extern ResourceId GetResID(MTL::CPPTYPE *objCWrapped); \ - extern MTL::CPPTYPE *AllocateObjCBridge(WrappedMTL##CPPTYPE *wrapped); +#define DECLARE_OBJC_HELPERS(CPPTYPE) \ + class WrappedMTL##CPPTYPE; \ + inline WrappedMTL##CPPTYPE *GetWrapped(MTL::CPPTYPE *cppType) \ + { \ + return (WrappedMTL##CPPTYPE *)cppType; \ + } \ + extern void AllocateObjCBridge(WrappedMTL##CPPTYPE *wrapped); METALCPP_WRAPPED_PROTOCOLS(DECLARE_OBJC_HELPERS) #undef DECLARE_OBJC_HELPERS diff --git a/renderdoc/driver/metal/metal_types_bridge.h b/renderdoc/driver/metal/metal_types_bridge.h index 31c6afa5c..ec795cca1 100644 --- a/renderdoc/driver/metal/metal_types_bridge.h +++ b/renderdoc/driver/metal/metal_types_bridge.h @@ -29,11 +29,13 @@ #import // clang-format off -#define DECLARE_OBJC_WRAPPED_INTERFACES(CPPTYPE) \ - @interface ObjCBridgeMTL##CPPTYPE : NSObject \ - @property(assign) WrappedMTL##CPPTYPE *wrappedCPP; \ - @property(readonly) id real; \ - @end +#define DECLARE_OBJC_WRAPPED_INTERFACES(CPPTYPE) \ + @interface ObjCBridgeMTL##CPPTYPE : NSObject \ + @end \ + inline WrappedMTL##CPPTYPE *GetWrapped(ObjCBridgeMTL##CPPTYPE *objCWrapped) \ + { \ + return (WrappedMTL##CPPTYPE *)objCWrapped; \ + } // clang-format on METALCPP_WRAPPED_PROTOCOLS(DECLARE_OBJC_WRAPPED_INTERFACES) diff --git a/renderdoc/driver/metal/metal_types_bridge.mm b/renderdoc/driver/metal/metal_types_bridge.mm deleted file mode 100644 index 20b8ca813..000000000 --- a/renderdoc/driver/metal/metal_types_bridge.mm +++ /dev/null @@ -1,87 +0,0 @@ -/****************************************************************************** - * The MIT License (MIT) - * - * Copyright (c) 2022 Baldur Karlsson - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - ******************************************************************************/ - -#include "metal_types_bridge.h" -#include "metal_command_buffer.h" -#include "metal_command_queue.h" -#include "metal_device.h" -#include "metal_function.h" -#include "metal_library.h" - -#define DEFINE_OBJC_HELPERS(CPPTYPE) \ - static ObjCBridgeMTL##CPPTYPE *GetObjCBridge(MTL::CPPTYPE *cppType) \ - { \ - if(cppType == NULL) \ - { \ - return NULL; \ - } \ - ObjCBridgeMTL##CPPTYPE *objC = (ObjCBridgeMTL##CPPTYPE *)cppType; \ - RDCASSERT([objC isKindOfClass:[ObjCBridgeMTL##CPPTYPE class]]); \ - return objC; \ - } \ - \ - WrappedMTL##CPPTYPE *GetWrapped(MTL::CPPTYPE *cppType) \ - { \ - ObjCBridgeMTL##CPPTYPE *objC = GetObjCBridge(cppType); \ - return objC.wrappedCPP; \ - } \ - \ - MTL::CPPTYPE *GetReal(MTL::CPPTYPE *cppType) \ - { \ - ObjCBridgeMTL##CPPTYPE *objC = GetObjCBridge(cppType); \ - MTL::CPPTYPE *real = (MTL::CPPTYPE *)objC.real; \ - return real; \ - } \ - \ - bool IsObjCBridge(MTL::CPPTYPE *cppType) \ - { \ - ObjCBridgeMTL##CPPTYPE *objC = (ObjCBridgeMTL##CPPTYPE *)cppType; \ - return [objC isKindOfClass:[ObjCBridgeMTL##CPPTYPE class]]; \ - } \ - \ - ResourceId GetResID(MTL::CPPTYPE *cppType) \ - { \ - WrappedMTL##CPPTYPE *wrappedCPP = GetWrapped(cppType); \ - if(wrappedCPP == NULL) \ - { \ - return ResourceId(); \ - } \ - return wrappedCPP->m_ID; \ - } \ - \ - MTL::CPPTYPE *AllocateObjCBridge(WrappedMTL##CPPTYPE *wrappedCPP) \ - { \ - ObjCBridgeMTL##CPPTYPE *objC = [ObjCBridgeMTL##CPPTYPE alloc]; \ - objC.wrappedCPP = wrappedCPP; \ - MTL::CPPTYPE *real = (MTL::CPPTYPE *)objC.real; \ - if(real) \ - { \ - objc_setAssociatedObject((id)real, objC, (id)objC, OBJC_ASSOCIATION_RETAIN); \ - [objC release]; \ - } \ - return (MTL::CPPTYPE *)objC; \ - } - -METALCPP_WRAPPED_PROTOCOLS(DEFINE_OBJC_HELPERS) -#undef DEFINE_OBJC_HELPERS