5#ifdef VISUTWIN_HAS_VULKAN
10#include "spdlog/spdlog.h"
14 void vulkanImmediateSubmit(VulkanGraphicsDevice* device,
15 const std::function<
void(VkCommandBuffer)>& func)
17 VkDevice vk = device->device();
18 VkCommandPool pool = device->uploadCommandPool();
20 VkCommandBufferAllocateInfo allocInfo{VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO};
21 allocInfo.commandPool = pool;
22 allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23 allocInfo.commandBufferCount = 1;
26 vkAllocateCommandBuffers(vk, &allocInfo, &cmd);
28 VkCommandBufferBeginInfo beginInfo{VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO};
29 beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
30 vkBeginCommandBuffer(cmd, &beginInfo);
34 vkEndCommandBuffer(cmd);
36 VkSubmitInfo submitInfo{VK_STRUCTURE_TYPE_SUBMIT_INFO};
37 submitInfo.commandBufferCount = 1;
38 submitInfo.pCommandBuffers = &cmd;
40 VkFence fence = device->uploadFence();
41 vkQueueSubmit(device->graphicsQueue(), 1, &submitInfo, fence);
42 vkWaitForFences(vk, 1, &fence, VK_TRUE, UINT64_MAX);
43 vkResetFences(vk, 1, &fence);
45 vkFreeCommandBuffers(vk, pool, 1, &cmd);
48 void vulkanTransitionImageLayout(VkCommandBuffer cmd, VkImage image,
49 VkImageLayout oldLayout, VkImageLayout newLayout, VkImageAspectFlags aspect)
51 VkImageMemoryBarrier barrier{VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER};
52 barrier.oldLayout = oldLayout;
53 barrier.newLayout = newLayout;
54 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
55 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
56 barrier.image = image;
57 barrier.subresourceRange.aspectMask = aspect;
58 barrier.subresourceRange.baseMipLevel = 0;
59 barrier.subresourceRange.levelCount = 1;
60 barrier.subresourceRange.baseArrayLayer = 0;
61 barrier.subresourceRange.layerCount = 1;
63 VkPipelineStageFlags srcStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
64 VkPipelineStageFlags dstStage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
66 if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED &&
67 newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
68 barrier.srcAccessMask = 0;
69 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
70 srcStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
71 dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT;
72 }
else if (oldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL &&
73 newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
74 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
75 barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
76 srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT;
77 dstStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
78 }
else if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED &&
79 newLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
80 barrier.srcAccessMask = 0;
81 barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
82 srcStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
83 dstStage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
84 }
else if (oldLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL &&
85 newLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {
86 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
87 barrier.dstAccessMask = 0;
88 srcStage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
89 dstStage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
90 }
else if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED &&
91 newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
92 barrier.srcAccessMask = 0;
93 barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
94 srcStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
95 dstStage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
98 vkCmdPipelineBarrier(cmd, srcStage, dstStage, 0,
99 0,
nullptr, 0,
nullptr, 1, &barrier);
114 default:
return VK_FORMAT_R8G8B8A8_UNORM;
124 return VK_FILTER_NEAREST;
126 return VK_FILTER_LINEAR;
130 VkSamplerAddressMode vulkanMapAddressMode(
AddressMode mode)
135 default:
return VK_SAMPLER_ADDRESS_MODE_REPEAT;
139 VkCullModeFlags vulkanMapCullMode(
CullMode mode)
146 default:
return VK_CULL_MODE_BACK_BIT;
150 VkPrimitiveTopology vulkanMapPrimitiveType(
PrimitiveType type)
159 default:
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
163 VkBlendFactor vulkanMapBlendFactor(
int factor)
179 default:
return VK_BLEND_FACTOR_ONE;
183 VkBlendOp vulkanMapBlendOp(
int op)
191 default:
return VK_BLEND_OP_ADD;
constexpr int BLENDMODE_ONE_MINUS_SRC_ALPHA
constexpr int BLENDMODE_ONE_MINUS_DST_ALPHA
@ PIXELFORMAT_DEPTHSTENCIL
constexpr int BLENDEQUATION_MAX
constexpr int BLENDMODE_DST_ALPHA
constexpr int BLENDMODE_ONE_MINUS_CONSTANT
constexpr int BLENDMODE_ONE_MINUS_SRC_COLOR
constexpr int BLENDEQUATION_REVERSE_SUBTRACT
constexpr int BLENDEQUATION_MIN
constexpr int BLENDMODE_ONE
constexpr int BLENDEQUATION_SUBTRACT
constexpr int BLENDMODE_SRC_COLOR
constexpr int BLENDMODE_CONSTANT
constexpr int BLENDEQUATION_ADD
constexpr int BLENDMODE_ZERO
constexpr int BLENDMODE_SRC_ALPHA
constexpr int BLENDMODE_SRC_ALPHA_SATURATE
@ ADDRESS_MIRRORED_REPEAT
constexpr int BLENDMODE_ONE_MINUS_DST_COLOR
constexpr int BLENDMODE_DST_COLOR
@ FILTER_NEAREST_MIPMAP_LINEAR
@ FILTER_NEAREST_MIPMAP_NEAREST