C # 'dan D3D12GetDebugInterface API nasıl kullanılır?
Şu anda Direct3D'yi c # üzerinden kullanmaya çalışıyorum ve D3D12GetDebugInterface API kullanarak başladım. İşlevin C ++ sözdizimi aşağıdaki gibidir (Microsoft belgelerinden kopyalanmıştır):
HRESULT D3D12GetDebugInterface(
REFIID riid,
void **ppvDebug
);
İşlevi C # 'a aktarırken sorun yaşıyorum. Belki de riid'in bir Guid yapısına işaretçi olması gerektiğini düşündüm ve ** ppvDebug için sadece bir IntPtr kullanıyorum. ** ppvDebug, bir ID3D12Debug arabirimine bir işaretçi işaretçisi olduğundan, C # kodunda ID3D12Debug arabirimini yeniden uygulamayı ve IntPtr'yi kullanılabilir bir ID3D12Debug arabirim örneğine çözümlemek için Marshal.PtrToStructure () kullanmayı denedim, ancak bu işe yaramaz. ID3D12Debug arayüzünün bir COM nesnesi olduğunu okuduğumu hatırlıyorum, ancak içe aktarabilmek için bir COM nesnesi için bir ID'ye ihtiyacınız yok mu? Belgelerin hiçbir yerinde herhangi bir COM kimliği bulamadım.
Her neyse, işte işlevden bir şey çıkarmak için son denemem:
[DllImport("D3D12.dll")]
static extern int D3D12GetDebugInterface(IntPtr riid, IntPtr ppvDebug);
void func() {
unsafe
{
IntPtr DebugControllerPtr = IntPtr.Zero;
Type InterfaceType = typeof(ID3D12Debug);
Guid ID = InterfaceType.GUID;
IntPtr ptr = Marshal.AllocHGlobal(sizeof(Guid));
Marshal.StructureToPtr(ID, ptr, false);
D3D12GetDebugInterface(ptr, DebugControllerPtr);
Marshal.FreeHGlobal(ptr);
ID3D12Debug DebugController = null;
Marshal.PtrToStructure(DebugControllerPtr, DebugController);
DebugController.EnableDebugLayer();
}
}
ID3D12Debug arayüzümü görmek istemeniz durumunda:
interface ID3D12Debug
{
void EnableDebugLayer();
}
Dediğim gibi, Direct3D'nin burada tamamen özlediğim COM'u kullandığını düşünüyorum, yani belki de bu yüzden çalışmıyor.
Yanıtlar
Birlikte çalışma kodunu bildirmenin genellikle birçok yolu vardır. İşte çalışması gereken bir tanesi:
public static void Main()
{
D3D12GetDebugInterface(typeof(ID3D12Debug).GUID, out var obj);
var debug = (ID3D12Debug)obj;
debug.EnableDebugLayer(); // for example
}
[DllImport("D3D12")]
public static extern int D3D12GetDebugInterface([MarshalAs(UnmanagedType.LPStruct)] Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppvDebug);
[Guid("344488b7-6846-474b-b989-f027448245e0"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ID3D12Debug
{
[PreserveSig]
void EnableDebugLayer();
}
- COM arabirimleri için arabirim Guid ve InterfaceType nitelikleri eklemelisiniz.
- Kılavuz, kullanılarak referansla kolayca geçirilebilir
UnmanagedType.LPStruct - Burada güvenli olmayan koda ihtiyacınız yok.
- Hataları kontrol etmelisiniz (kodumda geri alındı)
- DirectX ile .NET arabirim tanımlarına ihtiyacınız varsa, bu açık kaynaklı projeyi burada kullanabilirsiniz: https://github.com/smourier/DirectN, Örneğin: https://github.com/smourier/DirectN/blob/master/DirectN/DirectN/Generated/ID3D12Debug.cs