質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Vulkan

Vulkanは、業界団体クロノスグループが規格化したグラフィックスAPI。主にゲームエンジンやゲームアプリケーション向けのグラフィックに最適化されており、ローレベル(low level)APIです。3Dオブジェクトを用いたアニメーションを使用するゲームで性能を最大限に発揮します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1766閲覧

VulkanのWindows環境でVkSurfaceKHRが作成できない

Weapon

総合スコア106

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Vulkan

Vulkanは、業界団体クロノスグループが規格化したグラフィックスAPI。主にゲームエンジンやゲームアプリケーション向けのグラフィックに最適化されており、ローレベル(low level)APIです。3Dオブジェクトを用いたアニメーションを使用するゲームで性能を最大限に発揮します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/08/07 16:08

編集2021/08/07 16:25

前提・実現したいこと

VulkanのWindows環境においてWindows向けのVkSurfaceKHRvkCreateWin32SurfaceKHRで作成すると思いますが作成することができません。

VkResultとしてVK_ERROR_EXTENSION_NOT_PRESENTを返します。
エラーメッセージ通りVkInstance作成時にVK_KHR_WIN32_SURFACE_EXTENSION_NAMEを追加してやればいいのだと思いましたがvkEnumerateInstanceExtensionPropertiesで取得することはできませんし勝手に追加しても当然失敗します。

そもそもリファレンス www.khronos.org vkCreateWin32SurfaceKHRVK_ERROR_EXTENSION_NOT_PRESENTを返すとは書かれていません。(あり得るエラーだとは思いますが)

従来のVulkan ver.1.1のVK_LAYER_LUNARG_standard_validationレイヤーが有効なときにはできるのか確かめましたがこちらもたしか表示されませんでした。ですからVkInstanceの初期化や#ifdefの切り替えの問題だとは思いますがVK_LAYER_KHRONOS_validationレイヤーやウィンドウハンドルを自分で作ってくるサンプルも少ないのでわかりません。

どこか間違いがありましたらご指摘ください。

該当のソースコード

C

1#ifndef UNICODE 2#define UNICODE 3#endif 4 5#pragma comment(lib, "vulkan-1.lib") 6 7#include <cstdint> 8#include <vector> 9 10#include <Windows.h> 11#define VK_USE_PLATFORM_WIN32_KHR 12#include <vulkan/vulkan.h> 13 14namespace sample 15{ 16 constexpr wchar_t MAIN_CLASS_NAME[] = L"main window"; 17 constexpr wchar_t VK_CLASS_NAME[] = L"vulkan window"; 18 19 LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); 20 LRESULT CALLBACK VulkanProc(HWND, UINT, WPARAM, LPARAM); 21} 22 23int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR nCmdLine, _In_ int nCmdShow) 24{ 25 UNREFERENCED_PARAMETER(hPrevInstance); 26 UNREFERENCED_PARAMETER(nCmdLine); 27 28 WNDCLASSEXW wcx = 29 { 30 sizeof(WNDCLASSEXW), CS_VREDRAW | CS_HREDRAW, sample::WindowProc, 31 0,0,hInstance, 32 nullptr, static_cast<HCURSOR>(LoadCursor(nullptr, IDC_ARROW)), static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH)), 33 nullptr, sample::MAIN_CLASS_NAME, nullptr 34 }; 35 RegisterClassExW(&wcx); 36 37 HWND hwnd = CreateWindowExW( 38 0, sample::MAIN_CLASS_NAME, L"Vulkan Initialization", WS_OVERLAPPEDWINDOW, 39 0, 0, 960, 540, 40 nullptr, nullptr, hInstance, nullptr 41 ); 42 if (hwnd == nullptr)return -1; 43 44 ShowWindow(hwnd, nCmdShow); 45 UpdateWindow(hwnd); 46 47 MSG msg = {}; 48 49 while (GetMessage(&msg, NULL, 0, 0) > 0) { 50 TranslateMessage(&msg); 51 DispatchMessage(&msg); 52 } 53 54 return (int)msg.wParam; 55} 56 57namespace sample 58{ 59 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 60 { 61 static HINSTANCE hGlobalInstance = nullptr; 62 static HWND hwnd_vulkan = nullptr; 63 64 switch (uMsg) 65 { 66 case WM_CREATE: 67 { 68 CREATESTRUCTW* cs = reinterpret_cast<CREATESTRUCTW*>(lParam); 69 hGlobalInstance = cs->hInstance; 70 71 // Create Window for Vulkan 72 { 73 WNDCLASSEXW wcv = 74 { 75 sizeof(WNDCLASSEXW), CS_VREDRAW | CS_HREDRAW, sample::VulkanProc, 76 0, 0, hGlobalInstance, 77 nullptr, static_cast<HCURSOR>(LoadCursor(nullptr, IDC_ARROW)), static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH)), 78 nullptr, sample::VK_CLASS_NAME, nullptr 79 }; 80 81 RegisterClassExW(&wcv); 82 83 hwnd_vulkan = CreateWindowExW( 84 0, sample::VK_CLASS_NAME, L"Vulkan", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 85 0, 0, 480, 270, 86 hwnd, nullptr, hGlobalInstance, nullptr 87 ); 88 89 if (hwnd_vulkan == nullptr) 90 { 91 PostQuitMessage(0); 92 break; 93 } 94 } 95 96 // Initialize Vulkan 97 { 98 // Create VkInstance 99 VkInstance vki = nullptr; 100 { 101 const char* appName = "Initialize Vulkan"; 102 std::vector<VkLayerProperties> vkLayerProp; 103 104 uint32_t uLayerCount = 0; 105 vkEnumerateInstanceLayerProperties(&uLayerCount, nullptr); 106 vkLayerProp.resize(uLayerCount); 107 vkEnumerateInstanceLayerProperties(&uLayerCount, vkLayerProp.data()); 108 109 const char lpSelectedLayer[] = "VK_LAYER_KHRONOS_validation"; 110 // This layer is selected from vkEnumerateInstanceLayerProperties 111 // Disable to select "VK_LAYER_LUNARG_standard_validation" in ver.1.2 112 // We must use "VK_LAYER_KHRONOS_validation" 113 114 std::vector<VkExtensionProperties>vkExtensionProp; 115 std::vector<const char*>vkExtensionNames; 116 uint32_t uExtensionCount = 0; 117 vkEnumerateInstanceExtensionProperties(lpSelectedLayer, &uExtensionCount, nullptr); 118 vkExtensionProp.resize(uExtensionCount); 119 vkEnumerateInstanceExtensionProperties(lpSelectedLayer, &uExtensionCount, vkExtensionProp.data()); 120 // We may have to get "VK_KHR_WIN32_SURFACE_EXTENSION_NAME" here for Windows Environment but I can't 121 122 for (const VkExtensionProperties& i : vkExtensionProp) 123 { 124 vkExtensionNames.push_back(reinterpret_cast<const char*>(&i.extensionName)); 125 } 126 127 VkApplicationInfo vkai = 128 { 129 VK_STRUCTURE_TYPE_APPLICATION_INFO, 130 nullptr, 131 appName, 132 0, 133 appName, 134 VK_MAKE_VERSION(1, 2, 0), 135 VK_API_VERSION_1_2 136 }; 137 138 const char* layers[] = { lpSelectedLayer }; 139 140 VkInstanceCreateInfo vkici = 141 { 142 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 143 nullptr, 144 0, //reserved 145 &vkai, 146 1, 147 layers, 148 vkExtensionNames.size(), 149 vkExtensionNames.data() 150 }; 151 152 VkResult vr_vkci = vkCreateInstance(&vkici, nullptr, &vki); 153 if (vr_vkci != VK_SUCCESS) 154 { 155 MessageBox(hwnd, L"Failed to create VkInstance", L"CAUTION", MB_OK); 156 PostQuitMessage(0); 157 break; 158 } 159 } 160 161 // Create VkSurfaceKHR 162 VkSurfaceKHR vkSurface = nullptr; 163 { 164 VkWin32SurfaceCreateInfoKHR vk_winsfci = 165 { 166 VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, 167 nullptr, 168 0, //reserved 169 hGlobalInstance, 170 hwnd_vulkan 171 }; 172 173 VkResult vr_cws = vkCreateWin32SurfaceKHR(vki, &vk_winsfci, nullptr, &vkSurface); 174 if (vr_cws != VK_SUCCESS) 175 { 176 MessageBox(hwnd, L"Failed to create VkSurfaceKHR", L"CAUTION", MB_OK); 177 PostQuitMessage(0); 178 break; 179 } 180 } 181 } 182 } 183 break; 184 185 case WM_DESTROY: 186 PostQuitMessage(0); 187 return 0; 188 } 189 190 return DefWindowProcW(hwnd, uMsg, wParam, lParam); 191 } 192 193 LRESULT CALLBACK VulkanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 194 { 195 return DefWindowProcW(hwnd, uMsg, wParam, lParam); 196 } 197} 198

補足情報

Windows10 Pro
VisualStudio2022 Community Preview
Vulkan ver. 1.2.182.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

VK_KHR_WIN32_SURFACE_EXTENSION_NAMEのみ拡張レイヤーに設定した場合例外が発生していたのですが、
VK_KHR_WIN32_SURFACE_EXTENSION_NAMEだけでなくVK_KHR_WIN32_SURFACE_EXTENSION_NAMEも同時に設定することで正常に動作し

vkExtensionNames.push_back(VK_KHR_SURFACE_EXTENSION_NAME); vkExtensionNames.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);

vkCreateWin32SurfaceKHRも成功しました

投稿2021/08/10 14:20

編集2021/08/10 14:34
Weapon

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問