public Result UnwrapUnderlyingResource <T>(IDirect3DResource9 resource, ComObject commandQueue, out T?resource12) where T : ComObject
    {
        Result result = UnwrapUnderlyingResource(resource, commandQueue, typeof(T).GUID, out IntPtr nativePtr);

        if (result.Success)
        {
            resource12 = MarshallingHelpers.FromPointer <T>(nativePtr);
            return(result);
        }

        resource12 = null;
        return(result);
    }
    public unsafe Result ReturnUnderlyingResource(IDirect3DResource9 resource, ReadOnlySpan <ulong> signalValues, ReadOnlySpan <ComObject> fences)
    {
        if (signalValues.Length != fences.Length)
        {
            throw new ArgumentException($"{nameof(signalValues)} and {nameof(fences)} length must be the same");
        }

        IntPtr *ppFences = stackalloc IntPtr[fences.Length];

        for (int i = 0; i < fences.Length; i++)
        {
            ppFences[i] = (fences[i] == null) ? IntPtr.Zero : fences[i].NativePointer;
        }

        fixed(ulong *pSignalValues = signalValues)
        {
            return(ReturnUnderlyingResource(resource, signalValues.Length, pSignalValues, ppFences));
        }
    }
 public T UnwrapUnderlyingResource <T>(IDirect3DResource9 resource, ComObject commandQueue) where T : ComObject
 {
     UnwrapUnderlyingResource(resource, commandQueue, typeof(T).GUID, out IntPtr nativePtr).CheckError();
     return(MarshallingHelpers.FromPointer <T>(nativePtr) !);
 }