2

私は C# 用の Vulkan ラッパーに取り組んでおり (多くの人がそうしているように)、vkGetPhysicalDeviceFeaturesデータが返されないか、アクセス違反がスローされるという問題が少しあります。

未処理の面 - 署名:

仕様からの署名は次のとおりです。

void vkGetPhysicalDeviceFeatures(
    VkPhysicalDevice                            physicalDevice,
    VkPhysicalDeviceFeatures*                   pFeatures);

VkPhysicalDevicehandle次のように定義されたオブジェクトです。

#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);

第二に、私は実際に関数を間違って使用していました。vkEnumeratePhysicalDevices2回電話する必要があります。最初の呼び出しでデバイスの数を取得し、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

4

1 に答える 1