[訳]Vulkanチュートリアル(08)論理デバイスとキュー
12561 ワード
[訳]Vulkanチュートリアル(08)論理デバイスとキュー
Introduction入門
After selecting a physical device to use we need to set up a logical device to interface with it. The logical device creation process is similar to the instance creation process and describes the features we want to use. We also need to specify which queues to create now that we've queried which queue families are available. You can even create multiple logical devices from the same physical device if you have varying requirements.
使用する物理デバイスを選択した後、論理デバイスを設定してインタラクティブにする必要があります.論理デバイスの作成プロセスはinstanceの作成プロセスと似ており、私たちが使用したい特性を説明しています.どのキュー・ファミリーが使用可能かをクエリーした以上、どのキューを作成するかを明記する必要があります.複数のニーズがある場合は、同じ物理デバイスから複数の論理デバイスを作成することもできます.
Start by adding a new class member to store the logical device handle in.
まず、論理デバイスのハンドルを格納する新しいメンバーを追加します.
Next, add a
次に、
Specifying the queues to be created作成するキューを明記
The creation of a logical device involves specifying a bunch of details in structs again, of which the first one will be
論理デバイスを作成するには、いくつかのstructの多くの詳細な問題を明記する必要があります.最初は
The currently available drivers will only allow you to create a small number of queues for each queue family and you don't really need more than one. That's because you can create all of the command buffers on multiple threads and then submit them all at once on the main thread with a single low-overhead call.
現在使用可能なdriverでは、各キュー・ファミリーから少量のキューを作成できますが、1つ以上作成する必要はありません.これは、マルチスレッドにすべてのコマンドキャッシュを作成し、プライマリ・スレッドに一度にコミットできるため、低コストの呼び出しが必要です.
Vulkan lets you assign priorities to queues to influence the scheduling of command buffer execution using floating point numbers between
Vulkanは、コマンドキャッシュの実行スケジュールに影響を与えるために、キューに優先度(
Specifying used device featuresは、使用するデバイスの特性を示します.
The next information to specify is the set of device features that we'll be using. These are the features that we queried support for with
次に示す情報は、私たちが使用するデバイスの特性です.これらは、前の章で
Creating the logical device論理デバイスの作成
With the previous two structures in place, we can start filling in the main
最初の2つのstructを準備したら、
First add pointers to the queue creation info and device features structs:
まず、情報とデバイスプロパティstructを作成するポインタに追加します.
The remainder of the information bears a resemblance to the
残りの情報は
An example of a device specific extension is
特定のデバイスの拡張の一例は
Previous implementations of Vulkan made a distinction between instance and device specific validation layers, but this is no longer the case. That means that the
以前のVulkan実装ではinstanceとデバイス関連の検証層を区別していたが,現在ではそうではない.これは、
We won't need any device specific extensions for now.
デバイス関連の拡張は必要ありません.
That's it, we're now ready to instantiate the logical device with a call to the appropriately named
このようにして、論理デバイスを初期化する準備ができています(
The parameters are the physical device to interface with, the queue and usage info we just specified, the optional allocation callbacks pointer and a pointer to a variable to store the logical device handle in. Similarly to the instance creation function, this call can return errors based on enabling non-existent extensions or specifying the desired usage of unsupported features.
これらのパラメータは、物理デバイス、キュー、およびその使用法(明記済み)、オプションのコールバック関数ポインタ、論理デバイスハンドルの変数を保存するアドレスです.instanceを作成する関数と同様に、この呼び出しは拡張機能が欠けているか、サポートされていない特性が明記されているため、エラーコードを返します.
The device should be destroyed in
設備は
Logical devices don't interact directly with instances, which is why it's not included as a parameter.
論理デバイスはinstanceと直接インタラクティブではありません.これは、パラメータとしてデバイスに転送されていない理由です.
Retrieving queue handles検索キューのハンドル
The queues are automatically created along with the logical device, but we don't have a handle to interface with them yet. First add a class member to store a handle to the graphics queue:
キューは論理デバイスの作成に伴って自動的に作成されますが、インタラクティブなハンドルはありません.まず、グラフィックキューのハンドルを保存するメンバーを追加します.
Device queues are implicitly cleaned up when the device is destroyed, so we don't need to do anything in
デバイスキューは、デバイスが破棄されたときに自動的に暗黙的に破棄されるので、
We can use the
With the logical device and queue handles we can now actually start using the graphics card to do things! In the next few chapters we'll set up the resources to present results to the window system.
論理デバイスとキューハンドルがあれば、私たちは本当にグラフィックカードで何かをすることができます.次の章では、結果をウィンドウシステムに表示するためにリソースを設定します.
C++code C++コード Previous前章 Next次章
転載先:https://www.cnblogs.com/bitzhuwei/p/Vulkan-Tutorial-08-Logical-device-and-queue.html
Introduction入門
After selecting a physical device to use we need to set up a logical device to interface with it. The logical device creation process is similar to the instance creation process and describes the features we want to use. We also need to specify which queues to create now that we've queried which queue families are available. You can even create multiple logical devices from the same physical device if you have varying requirements.
使用する物理デバイスを選択した後、論理デバイスを設定してインタラクティブにする必要があります.論理デバイスの作成プロセスはinstanceの作成プロセスと似ており、私たちが使用したい特性を説明しています.どのキュー・ファミリーが使用可能かをクエリーした以上、どのキューを作成するかを明記する必要があります.複数のニーズがある場合は、同じ物理デバイスから複数の論理デバイスを作成することもできます.
Start by adding a new class member to store the logical device handle in.
まず、論理デバイスのハンドルを格納する新しいメンバーを追加します.
VkDevice device;
Next, add a
createLogicalDevice
function that is called from initVulkan
. 次に、
createLogicalDevice
関数を追加し、initVulkan
で呼び出します. 1 void initVulkan() {
2 createInstance();
3 setupDebugCallback();
4 pickPhysicalDevice();
5 createLogicalDevice();
6 }
7
8 void createLogicalDevice() {
9
10 }
Specifying the queues to be created作成するキューを明記
The creation of a logical device involves specifying a bunch of details in structs again, of which the first one will be
VkDeviceQueueCreateInfo
. This structure describes the number of queues we want for a single queue family. Right now we're only interested in a queue with graphics capabilities. 論理デバイスを作成するには、いくつかのstructの多くの詳細な問題を明記する必要があります.最初は
VkDeviceQueueCreateInfo
です.このstructは、1つのキュー・ファミリーから取得したいキューの数を説明します.今ではグラフィック機能のあるキューにしか興味がありません.1 QueueFamilyIndices indices = findQueueFamilies(physicalDevice);
2
3 VkDeviceQueueCreateInfo queueCreateInfo = {};
4 queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
5 queueCreateInfo.queueFamilyIndex = indices.graphicsFamily.value();
6 queueCreateInfo.queueCount = 1;
The currently available drivers will only allow you to create a small number of queues for each queue family and you don't really need more than one. That's because you can create all of the command buffers on multiple threads and then submit them all at once on the main thread with a single low-overhead call.
現在使用可能なdriverでは、各キュー・ファミリーから少量のキューを作成できますが、1つ以上作成する必要はありません.これは、マルチスレッドにすべてのコマンドキャッシュを作成し、プライマリ・スレッドに一度にコミットできるため、低コストの呼び出しが必要です.
Vulkan lets you assign priorities to queues to influence the scheduling of command buffer execution using floating point numbers between
0.0
and 1.0
. This is required even if there is only a single queue: Vulkanは、コマンドキャッシュの実行スケジュールに影響を与えるために、キューに優先度(
0.0
から1.0
の浮動小数点数)を付与します.1つのキューしかない場合でも、これは必要です.1 float queuePriority = 1.0f;
2 queueCreateInfo.pQueuePriorities = &queuePriority;
Specifying used device featuresは、使用するデバイスの特性を示します.
The next information to specify is the set of device features that we'll be using. These are the features that we queried support for with
vkGetPhysicalDeviceFeatures
in the previous chapter, like geometry shaders. Right now we don't need anything special, so we can simply define it and leave everything to VK_FALSE
. We'll come back to this structure once we're about to start doing more interesting things with Vulkan. 次に示す情報は、私たちが使用するデバイスの特性です.これらは、前の章で
vkGetPhysicalDeviceFeatures
関数でクエリーしたサポートされている特性です.今では特別なものは必要ありませんので、VK_FALSE
を維持するために簡単に定義することができます.私たちがVulkanでもっと興味のあることを始めたら、私たちはこのstructに戻ります.VkPhysicalDeviceFeatures deviceFeatures = {};
Creating the logical device論理デバイスの作成
With the previous two structures in place, we can start filling in the main
VkDeviceCreateInfo
structure. 最初の2つのstructを準備したら、
VkDeviceCreateInfo
構造体に埋め込むことができます.1 VkDeviceCreateInfo createInfo = {};
2 createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
First add pointers to the queue creation info and device features structs:
まず、情報とデバイスプロパティstructを作成するポインタに追加します.
1 createInfo.pQueueCreateInfos = &queueCreateInfo;
2 createInfo.queueCreateInfoCount = 1;
3
4 createInfo.pEnabledFeatures = &deviceFeatures;
The remainder of the information bears a resemblance to the
VkInstanceCreateInfo
struct and requires you to specify extensions and validation layers. The difference is that these are device specific this time.、 残りの情報は
VkInstanceCreateInfo
と似ており、拡張レイヤと検証レイヤを明記する必要があります.違いは、今回は特定の設備を対象にしたものです.An example of a device specific extension is
VK_KHR_swapchain
, which allows you to present rendered images from that device to windows. It is possible that there are Vulkan devices in the system that lack this ability, for example because they only support compute operations. We will come back to this extension in the swap chain chapter. 特定のデバイスの拡張の一例は
VK_KHR_swapchain
であり、デバイスからウィンドウに画像を表示することができる.システムには、この機能が欠けているVulkanデバイス、例えば計算動作のみをサポートするデバイスが存在する可能性がある.この拡張については、交換チェーンの章で説明します.Previous implementations of Vulkan made a distinction between instance and device specific validation layers, but this is no longer the case. That means that the
enabledLayerCount
and ppEnabledLayerNames
fields of VkDeviceCreateInfo
are ignored by up-to-date implementations. However, it is still a good idea to set them anyway to be compatible with older implementations: 以前のVulkan実装ではinstanceとデバイス関連の検証層を区別していたが,現在ではそうではない.これは、
VkDeviceCreateInfo
のenabledLayerCount
およびppEnabledLayerNames
フィールドが、新しいインプリメンテーションによって無視されることを意味する.しかし、古い実装と互換性を持つために、それらを設定するのは依然として良いアイデアです.1 createInfo.enabledExtensionCount = 0;
2
3 if (enableValidationLayers) {
4 createInfo.enabledLayerCount = static_cast(validationLayers.size());
5 createInfo.ppEnabledLayerNames = validationLayers.data();
6 } else {
7 createInfo.enabledLayerCount = 0;
8 }
We won't need any device specific extensions for now.
デバイス関連の拡張は必要ありません.
That's it, we're now ready to instantiate the logical device with a call to the appropriately named
vkCreateDevice
function. このようにして、論理デバイスを初期化する準備ができています(
vkCreateDevice
function関数を使用します).1 if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS) {
2 throw std::runtime_error("failed to create logical device!");
3 }
The parameters are the physical device to interface with, the queue and usage info we just specified, the optional allocation callbacks pointer and a pointer to a variable to store the logical device handle in. Similarly to the instance creation function, this call can return errors based on enabling non-existent extensions or specifying the desired usage of unsupported features.
これらのパラメータは、物理デバイス、キュー、およびその使用法(明記済み)、オプションのコールバック関数ポインタ、論理デバイスハンドルの変数を保存するアドレスです.instanceを作成する関数と同様に、この呼び出しは拡張機能が欠けているか、サポートされていない特性が明記されているため、エラーコードを返します.
The device should be destroyed in
cleanup
with the vkDestroyDevice
function: 設備は
cleanup
関数の中でvkDestroyDevice
関数で廃棄しなければならない.1 void cleanup() {
2 vkDestroyDevice(device, nullptr);
3 ...
4 }
Logical devices don't interact directly with instances, which is why it's not included as a parameter.
論理デバイスはinstanceと直接インタラクティブではありません.これは、パラメータとしてデバイスに転送されていない理由です.
Retrieving queue handles検索キューのハンドル
The queues are automatically created along with the logical device, but we don't have a handle to interface with them yet. First add a class member to store a handle to the graphics queue:
キューは論理デバイスの作成に伴って自動的に作成されますが、インタラクティブなハンドルはありません.まず、グラフィックキューのハンドルを保存するメンバーを追加します.
VkQueue graphicsQueue;
Device queues are implicitly cleaned up when the device is destroyed, so we don't need to do anything in
cleanup
. デバイスキューは、デバイスが破棄されたときに自動的に暗黙的に破棄されるので、
cleanup
で何をする必要はありません.We can use the
vkGetDeviceQueue
function to retrieve queue handles for each queue family. The parameters are the logical device, queue family, queue index and a pointer to the variable to store the queue handle in. Because we're only creating a single queue from this family, we'll simply use index 0
. vkGetDeviceQueue
関数を使用して、各キュー・ファミリーのキュー・ハンドルを取得できます.そのパラメータは、論理デバイス、キューファミリー、キューインデックス、キューハンドルの変数を保存するポインタです.キューを1つしか作成しないので、インデックス0
を使用します.vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0, &graphicsQueue);
With the logical device and queue handles we can now actually start using the graphics card to do things! In the next few chapters we'll set up the resources to present results to the window system.
論理デバイスとキューハンドルがあれば、私たちは本当にグラフィックカードで何かをすることができます.次の章では、結果をウィンドウシステムに表示するためにリソースを設定します.
C++code C++コード
転載先:https://www.cnblogs.com/bitzhuwei/p/Vulkan-Tutorial-08-Logical-device-and-queue.html