2017-01-12 11 views
0

Vulkanを習得し始めました。 Graham Sellersの本「Vulkan Programming Guide」と私のシステムのAMDGPUプロドライバを搭載したRX 480があります。私はArch Linuxを実行しています。私は自分のシステムでVulkanのデモを実行することができました。vkCreateInstanceによってセグメント違反が発生しました

私はセグメント化エラーを引き起こす最小のコードブロックを持っています。奇妙なことに、この疑問を提起するためにこのブロックを生成する途中で、vkCreateInstance()がコンストラクタから呼び出されて実行され、最初にコードにtry/catchを追加したときにセグメント化エラーが発生しました。

#include <iostream> 
#include <vulkan/vulkan.h> 

int main(int argv, char* argc[]) 
{ 
    VkInstance* instance; 
    VkApplicationInfo appInfo = { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, 
            .pNext = NULL, 
            .pApplicationName = "Step 1", 
            .applicationVersion = 1, 
            .pEngineName = NULL, 
            .engineVersion = 0, 
            .apiVersion = VK_MAKE_VERSION(1, 0, 26) }; //This is what vulkanCapsViewer says my API version is. 

    VkInstanceCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 
             .pNext = NULL, 
             .flags = 0 }; 
    createInfo.pApplicationInfo = &appInfo; 
    createInfo.enabledExtensionCount = 0; 
    createInfo.ppEnabledExtensionNames = NULL; 
    createInfo.enabledLayerCount = 0; 
    createInfo.ppEnabledLayerNames = NULL; 

    std::cout << "1\n"; 
    VkResult result = vkCreateInstance(&createInfo, NULL, instance); 
    std::cout << "2\n"; 
    if(result != VK_SUCCESS) std::cout << "Failed to create a Vulkan instance: " << result << std::endl; 
    std::cout << "3\n"; 
    return 0; 
} 

出力は次のとおりです:

さて、/キャッチしようとさえすることなく、これがセグメンテーションフォールトを起こし

93> ./create_seg_fault 
1 
Segmentation fault (core dumped) 
+1

指定された初期化子は(まだ)C++の機能ではありません。つまり、あなたのコードはCとC++のハイブリッドを使用しています。 –

答えて

2

vkCreateInstanceそれが記入することを割り当てられたオブジェクトへのポインタ、あなたが与えていると想定していスタック上のオブジェクトを作成し、そのアドレスを与える:

VkInstance instance; 
    ... 
    VkResult result = vkCreateInstance(&createInfo, NULL, &instance); 
(これは、デバッグ時に0になる可能性があり、リリースではガーベジになる可能性があります)

でも、このオブジェクトは関数のスコープが終了すると消滅することに注意してください(この場合はmain)。

+1

これは基本的には正しいですが、VkInstanceはVkInstance_t *のtypedefです。したがって、ポスターのコードでは、初期化されていないVkInstance_t **があります。正しいコードでは、VkInstance_t *のアドレスを取得し、有効なアドレスをvkCreateInstanceに渡します。ただし、動的に作成されたインスタンスへのポインタが返されるため、関数exit(VkInstance_t *の実行)でスコープから外れることはありません。 –

関連する問題