やっていくVulkan入門

2-2. 論理デバイス

論理デバイスの作成

物理デバイスを選んだら次は論理デバイスを作成します。VulkanにおいてGPUの能力を使うような機能は、全てこの論理デバイスを通して利用します。GPUの能力を使う際、物理デバイスを直接いじることは出来ません。

コンピュータの仕組みについて多少知識のある人であれば、この「物理」「論理」の区別はメモリアドレスの「物理アドレス」「論理アドレス」と同じ話であることが想像できるでしょう。マルチタスクOS上で、1つのプロセスが特定のGPU(=物理デバイス)を独占して管理するような状態はよろしくありません。そこで仮想化されたデバイスが論理デバイスです。これならあるプロセスが他のプロセスの存在を意識することなくGPUの能力を使うことができます。

論理デバイスは次のように作成します。

vk::DeviceCreateInfo devCreateInfo;
vk::UniqueDevice device = physicalDevice.createDeviceUnique(devCreateInfo);

createDeviceメソッドを用いて物理デバイスから論理デバイスを作成することができます。(Uniqueという部分については前回説明したので端折ります。)

インスタンスを作成するときにvk::InstanceCreateInfo構造体を使ったのと同じように、論理デバイス作成時にもvk::DeviceCreateInfo構造体の中に色々な情報を含めることができます。これは次回「2-3. キュー」の項で実際に使用することになります。


この節では論理デバイスの作成をやりました。次回はキューの取得をやります。

この節まで読んだ人は補講1. バリデーションレイヤーを読むことをお勧めします。

この節のコード
#include <vulkan/vulkan.hpp>
#include <vector>

int main() {
    vk::InstanceCreateInfo createInfo;

    vk::UniqueInstance instance;
    instance = vk::createInstanceUnique(createInfo);

    std::vector<vk::PhysicalDevice> physicalDevices = instance->enumeratePhysicalDevices();

    vk::PhysicalDevice physicalDevice = physicalDevices[0];

    vk::DeviceCreateInfo devCreateInfo;
    vk::UniqueDevice device = physicalDevice.createDeviceUnique(devCreateInfo);

    return 0;
}

cmake_minimum_required(VERSION 3.22)

project(vulkan-test)

set(CMAKE_CXX_STANDARD 17)

add_executable(app main.cpp)

find_package(Vulkan REQUIRED)
target_include_directories(app PRIVATE ${Vulkan_INCLUDE_DIRS})
target_link_libraries(app PRIVATE ${Vulkan_LIBRARIES})