1
私はいつもスワップチェーンの作成に悩まされています。なぜか分かりません。私は、検証レイヤーを有効にし、私が得た最高のanwserは次のとおりです。ワットは "vkCreateSwapchainKHR:内部ドロアブルの作成に失敗しました。"手段
- vkCreateSwapchainKHR:内部描画可能な作成が、私はNvidiaのGTX960カードを持っている
に失敗しました。私はそれにいくつかのvulkanのサンプルを実行したので、それはvulkanをサポートする必要があります。ここで
は私swapchain作成者機能である:
void Renderer::createSwapChain(VkSwapchainKHR *swapchain,VkPhysicalDevice *dev,VkDevice *vulk_dev,VkSurfaceKHR *surface, uint32_t family_index,VkExtent2D *extent) {
uint32_t format_count;
VkFormat format;
VkBool32 support;
vkGetPhysicalDeviceSurfaceSupportKHR(*dev, family_index, *surface, &support);
if (!support) {
fprintf(*Renderer::error_log, "%d :Surface is not supported.", __LINE__);
fclose(*Renderer::error_log);
exit(-1);
}
vkGetPhysicalDeviceSurfaceFormatsKHR(*dev, *surface, &format_count, nullptr);
vector<VkSurfaceFormatKHR> surface_format(format_count);
vkGetPhysicalDeviceSurfaceFormatsKHR(*dev, *surface, &format_count, surface_format.data());
if(1 == format_count && surface_format[0].format == VK_FORMAT_UNDEFINED) {
format = VK_FORMAT_B8G8R8A8_UNORM;
infos.format.color_format = VK_FORMAT_B8G8R8A8_UNORM;
}else {
format = surface_format[0].format;
}
VkFormat depth_format = VK_FORMAT_D16_UNORM;
VkFormatProperties format_props;
vkGetPhysicalDeviceFormatProperties(*dev, depth_format, &format_props);
if (format_props.linearTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
infos.tiling = VK_IMAGE_TILING_LINEAR;
}else if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
infos.tiling = VK_IMAGE_TILING_OPTIMAL;
}else {
fprintf(*Renderer::error_log, "%d: VK_FORMAT_D16_UNORM is not supported",__LINE__);
fclose(*Renderer::error_log);
exit(-1);
}
VkPresentModeKHR present_mode_selected = VK_PRESENT_MODE_FIFO_KHR;
uint32_t present_modes_c;
vkGetPhysicalDeviceSurfacePresentModesKHR(*dev, *surface, &present_modes_c, nullptr);
vector<VkPresentModeKHR> present_modes(present_modes_c);
vkGetPhysicalDeviceSurfacePresentModesKHR(*dev, *surface,&present_modes_c,present_modes.data());
for (int i = 0; i < present_modes_c; i++) {
if (present_modes[i] == VK_PRESENT_MODE_MAILBOX_KHR) {
cout << "Mailbox supported." << endl;
present_mode_selected = VK_PRESENT_MODE_MAILBOX_KHR;
}
}
VkSurfaceCapabilitiesKHR capabilities;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(*dev, *surface, &capabilities);
if (capabilities.maxImageExtent.width < (*extent).width) {
(*extent).width = capabilities.maxImageExtent.width;
}
if (capabilities.maxImageExtent.height < (*extent).height) {
(*extent).height = capabilities.maxImageExtent.height;
}
VkCompositeAlphaFlagBitsKHR composite_alpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
if (capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR) {
composite_alpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
}else if (capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR) {
composite_alpha =VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
}
VkSurfaceTransformFlagBitsKHR transform;
if (capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) {
transform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
}else {
transform = capabilities.currentTransform;
}
VkSwapchainCreateInfoKHR swapchain_ci = {};
swapchain_ci.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
swapchain_ci.pNext = NULL;
swapchain_ci.surface = *surface;
swapchain_ci.minImageCount = capabilities.minImageCount;
swapchain_ci.imageFormat = format;
swapchain_ci.imageExtent = capabilities.currentExtent;
swapchain_ci.preTransform = transform;
swapchain_ci.compositeAlpha = composite_alpha;
swapchain_ci.imageArrayLayers = 1;
swapchain_ci.presentMode = present_mode_selected;
swapchain_ci.oldSwapchain = VK_NULL_HANDLE;
swapchain_ci.clipped = true;
swapchain_ci.imageColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;
swapchain_ci.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
swapchain_ci.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
swapchain_ci.queueFamilyIndexCount = 0;
if (VK_SUCCESS != vkCreateSwapchainKHR(*vulk_dev, &swapchain_ci, nullptr, swapchain)) {
fprintf(*Renderer::error_log, "%d: Couldn't create Swapchain", __LINE__);
fclose(*Renderer::error_log);
exit(-1);
}else {
cout << "Swapchain created successfully" << endl;
}
}
作業サンプルのスワップチェーン作成コードを徐々に変更して、スワップチェーン作成コードに一致させ、破損箇所を突き止めることができます。 – Columbo
PS:コマンドはどのようなリターンコードを返しますか?お使いのプラットフォーム(OS、ドライババージョン、SDK)は何ですか? – krOoze
いくつかの注意事項:1)ポインタをポインタとして渡す必要はありません。2)すべてのコマンドから 'VkResult'をチェックする必要があります。3)'(*).'は必要ありません。あなたが想定しているように 'VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR'がサポートされているという保証はありません5)同様に変換6)' swapchain_ci.imageExtent = capabilities.currentExtent; 'は 'capabilities'の特別な値を考慮していません.currentExtent' – krOoze