2016-12-29 4 views
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; 
    } 
} 
+0

作業サンプルのスワップチェーン作成コードを徐々に変更して、スワップチェーン作成コードに一致させ、破損箇所を突き止めることができます。 – Columbo

+1

PS:コマンドはどのようなリターンコードを返しますか?お使いのプラットフォーム(OS、ドライババージョン、SDK)は何ですか? – krOoze

+0

いくつかの注意事項:1)ポインタをポインタとして渡す必要はありません。2)すべてのコマンドから 'VkResult'をチェックする必要があります。3)'(*).'は必要ありません。あなたが想定しているように 'VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR'がサポートされているという保証はありません5)同様に変換6)' swapchain_ci.imageExtent = capabilities.currentExtent; 'は 'capabilities'の特別な値を考慮していません.currentExtent' – krOoze

答えて

2

私は最近、これと同じ問題を抱えていた、問題はGLFWウィンドウでのOpenGLコンテキストによって引き起こされました。

あなたがGLFWを使用することが起こる場合は、ウィンドウを作成する前に、ライン

glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); 

が含まれます。

関連する問題