私は C# 用の Vulkan ラッパーに取り組んでおり (多くの人がそうしているように)、vkGetPhysicalDeviceFeatures
データが返されないか、アクセス違反がスローされるという問題が少しあります。
未処理の面 - 署名:
仕様からの署名は次のとおりです。
void vkGetPhysicalDeviceFeatures(
VkPhysicalDevice physicalDevice,
VkPhysicalDeviceFeatures* pFeatures);
VkPhysicalDevice
handle
次のように定義されたオブジェクトです。
#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;
VK_DEFINE_HANDLE(VkPhysicalDevice)
これは単なるポインターであり、この形状のオブジェクトのラッパーを使用IntPtr
する他のインポートは機能します。SafeHandle
マネージ側 - DLL インポート:
予想される DLL インポート (ただし失敗):
[DllImport("vulkan-1.dll", EntryPoint = "vkGetPhysicalDeviceFeatures")]
internal static extern void GetPhysicalDeviceFeatures(PhysicalDeviceHandle physicalDevice, ref IntPtr features);
これは、他の作業中のインポートに似ています。注:PhysicalDeviceHandle
派生SafeHandle
元はにマーシャリングする必要がありますIntPtr
。このパターンで機能する他のインポートがあります。上記は、呼び出されるとアクセス違反をスローします。
プラットホーム:
- Windows 10 (x64)
- Nvidia ドライバー:
356.43-vkonly
(最新)
アップデート
@V. クラフチェンコは正しかった
上記のインポートに問題はありませんでした。私の問題は実際にはvkEnumeratePhysicalDevices
通話にありました。
まず、インポートが間違っていました。正しいインポートは次のようになります。
[DllImport("vulkan-1.dll", EntryPoint = "vkEnumeratePhysicalDevices ")]
internal static extern Result EnumeratePhysicalDevices (InstanceHandle instance, ref physicalDeviceCount, IntPtr[] physicalDevices);
第二に、私は実際に関数を間違って使用していました。vkEnumeratePhysicalDevices
2回電話する必要があります。最初の呼び出しでデバイスの数を取得し、2 番目の呼び出しでデバイスの配列を設定します。
IntPtr[] devices = new IntPtr[]();
uint deviceCount = 0;
// populates deviceCount with the number of devices
Vk.EnumeratePhysicalDevices(instanceHandle, ref deviceCount, null);
// populates the devices array with the handle to each device, will only populate up to deviceCount devices
Vk.EnumeratePhysicalDevices(instanceHandle, ref deviceCount, devices);
注:これは、関数のドキュメントの説明/有効な使用法セクションで概説されていますが、最初に読んだときに正しく解釈できませんでした。
最終的に適切なハンドル値を取得するEnumeratePhysicalDevices
と、最終的な呼び出しがGetPhysicalDeviceFeatures
期待どおりに機能しました。の最終的なインポートはGetPhysicalDeviceFeatures
次のようになります。
[DllImport("vulkan-1.dll", EntryPoint = "vkGetPhysicalDeviceFeatures")]
internal static extern void GetPhysicalDeviceFeatures(PhysicalDeviceHandle physicalDevice, ref VkPhysicalDeviceFeatures features);
注: 名前に が含まれる変数Handle
は、 のサブクラスですSafeHandle
。