Android-cuttlefish cvd tool
vulkan.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <functional>
20#include <optional>
21#include <string>
22#include <vector>
23
25
26#include "vulkan/vulkan_raii.hpp"
27#include "vulkan/vulkan_to_string.hpp"
28
29namespace gfxstream {
30
31#define VK_EXPECT(x) \
32 ({ \
33 auto expected = (x); \
34 if (!expected.ok()) { \
35 return gfxstream::unexpected(expected.error()); \
36 }; \
37 std::move(expected.value()); \
38 })
39
40#define VK_EXPECT_RESULT(x) \
41 do { \
42 vk::Result result = (x); \
43 if (result != vk::Result::eSuccess) { \
44 return gfxstream::unexpected(result); \
45 } \
46 } while (0);
47
48#define VK_EXPECT_RV(x) \
49 ({ \
50 auto vk_rv = (x); \
51 if (vk_rv.result != vk::Result::eSuccess) { \
52 return gfxstream::unexpected(vk_rv.result); \
53 }; \
54 std::move(vk_rv.value); \
55 })
56
57#define VK_EXPECT_RV_OR_STRING(x) \
58 ({ \
59 auto vk_rv = (x); \
60 if (vk_rv.result != vk::Result::eSuccess) { \
61 return gfxstream::unexpected(std::string("Failed to " #x ": ") + \
62 vk::to_string(vk_rv.result)); \
63 }; \
64 std::move(vk_rv.value); \
65 })
66
67#define VK_TRY(x) \
68 do { \
69 vk::Result result = (x); \
70 if (result != vk::Result::eSuccess) { \
71 return result; \
72 } \
73 } while (0);
74
75#define VK_TRY_RV(x) \
76 ({ \
77 auto vk_rv = (x); \
78 if (vk_rv.result != vk::Result::eSuccess) { \
79 return vk_rv.result; \
80 }; \
81 std::move(vk_rv.value); \
82 })
83
84class Vk {
85 public:
87 const std::vector<std::string>& instance_extensions = {},
88 const std::vector<std::string>& instance_layers = {},
89 const std::vector<std::string>& device_extensions = {});
90
91 Vk(const Vk&) = delete;
92 Vk& operator=(const Vk&) = delete;
93
94 Vk(Vk&&) = default;
95 Vk& operator=(Vk&&) = default;
96
98 vk::UniqueBuffer buffer;
99 vk::UniqueDeviceMemory bufferMemory;
100 };
102 vk::DeviceSize buffer_size, vk::BufferUsageFlags buffer_usages,
103 vk::MemoryPropertyFlags buffer_memory_properties);
105 vk::DeviceSize buffer_size, vk::BufferUsageFlags buffer_usages,
106 vk::MemoryPropertyFlags buffer_memory_properties,
107 const uint8_t* buffer_data);
108
110 const std::function<vk::Result(vk::UniqueCommandBuffer&)>& func,
111 const std::vector<vk::UniqueSemaphore>& semaphores_wait = {},
112 const std::vector<vk::UniqueSemaphore>& semaphores_signal = {});
113
115 vk::UniqueImage image;
116 vk::UniqueDeviceMemory imageMemory;
117 vk::UniqueImageView imageView;
118 };
120 uint32_t width, uint32_t height, vk::Format format,
121 vk::ImageUsageFlags usages, vk::MemoryPropertyFlags memory_properties,
122 vk::ImageLayout returned_layout);
123
125 uint32_t width, uint32_t height, const vk::UniqueImage& image,
126 vk::ImageLayout current_layout, vk::ImageLayout returned_layout);
127
129 vk::UniqueSamplerYcbcrConversion imageSamplerConversion;
130 vk::UniqueSampler imageSampler;
131 vk::UniqueDeviceMemory imageMemory;
132 vk::UniqueImage image;
133 vk::UniqueImageView imageView;
134 };
136 uint32_t width, uint32_t height, vk::ImageUsageFlags usages,
137 vk::MemoryPropertyFlags memory_properties,
138 vk::ImageLayout returned_layout);
139
140 vk::Result LoadYuvImage(const vk::UniqueImage& image, uint32_t width,
141 uint32_t height,
142 const std::vector<uint8_t>& image_data_y,
143 const std::vector<uint8_t>& image_data_u,
144 const std::vector<uint8_t>& image_data_v,
145 vk::ImageLayout current_layout,
146 vk::ImageLayout returned_layout);
147
149 std::optional<ImageWithMemory> colorAttachment;
150 std::optional<ImageWithMemory> depthAttachment;
151 vk::UniqueRenderPass renderpass;
152 vk::UniqueFramebuffer framebuffer;
153 };
155 uint32_t width, uint32_t height,
156 vk::Format colorAttachmentFormat = vk::Format::eUndefined,
157 vk::Format depthAttachmentFormat = vk::Format::eUndefined);
158
159 vk::Instance& instance() { return *mInstance; }
160
161 vk::Device& device() { return *mDevice; }
162
163 private:
164 Vk(vk::detail::DynamicLoader loader, vk::UniqueInstance instance,
165 std::optional<vk::UniqueDebugUtilsMessengerEXT> debug,
166 vk::PhysicalDevice physical_device, vk::UniqueDevice device,
167 vk::Queue queue, uint32_t queue_family_index,
168 vk::UniqueCommandPool command_pool, vk::UniqueBuffer stagingBuffer,
169 vk::UniqueDeviceMemory stagingBufferMemory)
170 : mLoader(std::move(loader)),
171 mInstance(std::move(instance)),
172 mDebugMessenger(std::move(debug)),
173 mPhysicalDevice(std::move(physical_device)),
174 mDevice(std::move(device)),
175 mQueue(std::move(queue)),
176 mQueueFamilyIndex(queue_family_index),
177 mCommandPool(std::move(command_pool)),
178 mStagingBuffer(std::move(stagingBuffer)),
179 mStagingBufferMemory(std::move(stagingBufferMemory)) {}
180
181 // Note: order is important for destruction.
182 vk::detail::DynamicLoader mLoader;
183 vk::UniqueInstance mInstance;
184 std::optional<vk::UniqueDebugUtilsMessengerEXT> mDebugMessenger;
185 vk::PhysicalDevice mPhysicalDevice;
186 vk::UniqueDevice mDevice;
187 vk::Queue mQueue;
189 vk::UniqueCommandPool mCommandPool;
190 static constexpr const VkDeviceSize kStagingBufferSize = 32 * 1024 * 1024;
191 vk::UniqueBuffer mStagingBuffer;
192 vk::UniqueDeviceMemory mStagingBufferMemory;
193};
194
195} // namespace gfxstream
Definition: vulkan.h:84
vk::UniqueCommandPool mCommandPool
Definition: vulkan.h:189
Vk(Vk &&)=default
Vk(vk::detail::DynamicLoader loader, vk::UniqueInstance instance, std::optional< vk::UniqueDebugUtilsMessengerEXT > debug, vk::PhysicalDevice physical_device, vk::UniqueDevice device, vk::Queue queue, uint32_t queue_family_index, vk::UniqueCommandPool command_pool, vk::UniqueBuffer stagingBuffer, vk::UniqueDeviceMemory stagingBufferMemory)
Definition: vulkan.h:164
static gfxstream::expected< Vk, vk::Result > Load(const std::vector< std::string > &instance_extensions={}, const std::vector< std::string > &instance_layers={}, const std::vector< std::string > &device_extensions={})
Definition: vulkan.cpp:100
gfxstream::expected< ImageWithMemory, vk::Result > CreateImage(uint32_t width, uint32_t height, vk::Format format, vk::ImageUsageFlags usages, vk::MemoryPropertyFlags memory_properties, vk::ImageLayout returned_layout)
Definition: vulkan.cpp:299
uint32_t mQueueFamilyIndex
Definition: vulkan.h:188
vk::UniqueDeviceMemory mStagingBufferMemory
Definition: vulkan.h:192
vk::Device & device()
Definition: vulkan.h:161
vk::Queue mQueue
Definition: vulkan.h:187
static constexpr const VkDeviceSize kStagingBufferSize
Definition: vulkan.h:190
vk::detail::DynamicLoader mLoader
Definition: vulkan.h:182
vk::Result DoCommandsImmediate(const std::function< vk::Result(vk::UniqueCommandBuffer &)> &func, const std::vector< vk::UniqueSemaphore > &semaphores_wait={}, const std::vector< vk::UniqueSemaphore > &semaphores_signal={})
Definition: vulkan.cpp:951
vk::UniqueBuffer mStagingBuffer
Definition: vulkan.h:191
vk::UniqueInstance mInstance
Definition: vulkan.h:183
vk::Result LoadYuvImage(const vk::UniqueImage &image, uint32_t width, uint32_t height, const std::vector< uint8_t > &image_data_y, const std::vector< uint8_t > &image_data_u, const std::vector< uint8_t > &image_data_v, vk::ImageLayout current_layout, vk::ImageLayout returned_layout)
Definition: vulkan.cpp:648
gfxstream::expected< FramebufferWithAttachments, vk::Result > CreateFramebuffer(uint32_t width, uint32_t height, vk::Format colorAttachmentFormat=vk::Format::eUndefined, vk::Format depthAttachmentFormat=vk::Format::eUndefined)
Definition: vulkan.cpp:810
Vk(const Vk &)=delete
std::optional< vk::UniqueDebugUtilsMessengerEXT > mDebugMessenger
Definition: vulkan.h:184
Vk & operator=(const Vk &)=delete
vk::Instance & instance()
Definition: vulkan.h:159
vk::PhysicalDevice mPhysicalDevice
Definition: vulkan.h:185
Vk & operator=(Vk &&)=default
gfxstream::expected< std::vector< uint8_t >, vk::Result > DownloadImage(uint32_t width, uint32_t height, const vk::UniqueImage &image, vk::ImageLayout current_layout, vk::ImageLayout returned_layout)
Definition: vulkan.cpp:396
gfxstream::expected< YuvImageWithMemory, vk::Result > CreateYuvImage(uint32_t width, uint32_t height, vk::ImageUsageFlags usages, vk::MemoryPropertyFlags memory_properties, vk::ImageLayout returned_layout)
Definition: vulkan.cpp:505
gfxstream::expected< BufferWithMemory, vk::Result > CreateBufferWithData(vk::DeviceSize buffer_size, vk::BufferUsageFlags buffer_usages, vk::MemoryPropertyFlags buffer_memory_properties, const uint8_t *buffer_data)
Definition: vulkan.cpp:269
gfxstream::expected< BufferWithMemory, vk::Result > CreateBuffer(vk::DeviceSize buffer_size, vk::BufferUsageFlags buffer_usages, vk::MemoryPropertyFlags buffer_memory_properties)
Definition: vulkan.cpp:262
vk::UniqueDevice mDevice
Definition: vulkan.h:186
Definition: expected.h:33
#define debug(format, args...)
Definition: fec_private.h:197
EventFormat format
Definition: kernel_log_server.cc:57
std::string Format(const TimeStamp &time_point)
Definition: instance_database_types.cpp:42
android::base::expected< T, StackTraceError > Result
Definition: result.h:281
Definition: egl.cpp:21
Definition: logging.h:464
Definition: vulkan.h:97
vk::UniqueBuffer buffer
Definition: vulkan.h:98
vk::UniqueDeviceMemory bufferMemory
Definition: vulkan.h:99
vk::UniqueRenderPass renderpass
Definition: vulkan.h:151
vk::UniqueFramebuffer framebuffer
Definition: vulkan.h:152
std::optional< ImageWithMemory > depthAttachment
Definition: vulkan.h:150
std::optional< ImageWithMemory > colorAttachment
Definition: vulkan.h:149
Definition: vulkan.h:114
vk::UniqueImageView imageView
Definition: vulkan.h:117
vk::UniqueImage image
Definition: vulkan.h:115
vk::UniqueDeviceMemory imageMemory
Definition: vulkan.h:116
Definition: vulkan.h:128
vk::UniqueImageView imageView
Definition: vulkan.h:133
vk::UniqueSamplerYcbcrConversion imageSamplerConversion
Definition: vulkan.h:129
vk::UniqueImage image
Definition: vulkan.h:132
vk::UniqueSampler imageSampler
Definition: vulkan.h:130
vk::UniqueDeviceMemory imageMemory
Definition: vulkan.h:131
Definition: image.h:38