1 #include <kiba/gpu/command.h>
2 #include <kiba/gpu/vulkan/allocator.h>
3 #include <kiba/gpu/vulkan/conv.h>
4 #include <kiba/gpu/vulkan/device.h>
5 #include <kiba/gpu/vulkan/instance.h>
6 #include <kiba/gpu/vulkan/queue.h>
7 #include <kiba/gpu/vulkan/util.h>
8 #include "vulkan/vulkan_core.h"
13 if (!vk_queue_get_command_encoder(device, encoder)) {
14 KB_ERROR(
"failed to create command buffer for command encoder");
19 vk_device_set_object_name(device->logical, VK_OBJECT_TYPE_COMMAND_BUFFER, encoder->buffer, desc.label);
25 vk_queue_return_command_encoder(device, *encoder);
26 encoder->buffer = VK_NULL_HANDLE;
30 return vk_queue_submit_encoder(encoder, device);
34 VkCommandBufferBeginInfo begin_info = {
35 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
36 .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
38 VK_CALL_B8(vkBeginCommandBuffer(encoder->buffer, &begin_info));
48 VkBufferCopy copy_info = {
49 .srcOffset = (VkDeviceSize) src_offset,
50 .dstOffset = (VkDeviceSize) dst_offset,
51 .size = (VkDeviceSize) size,
53 vkCmdCopyBuffer(encoder->buffer, src->raw, dst->raw, 1, ©_info);
59 u32 clear_value_count = 0;
60 VkClearValue clear_values[KB_GPU_MAX_ATTACHMENTS] = {0};
65 .width = (u32) desc.extent.width,
66 .height = (u32) desc.extent.height,
67 .depth = (u32) desc.extent.layers,
71 for (usize i = 0; i < desc.color_attachment_count; ++i) {
75 clear_values[clear_value_count++] = (VkClearValue){
78 (f32) col_at.ops.clear_color.r,
79 (f32) col_at.ops.clear_color.g,
80 (f32) col_at.ops.clear_color.b,
81 (f32) col_at.ops.clear_color.a,
87 .format = vk_convert_texture_format(col_at.view->desc.format),
88 .layout = vk_optimal_image_layout(GPU_TEXTURE_USE_COLOR_TARGET, col_at.view->desc.format),
89 .ops = gpu_operations_to_attachment_ops(col_at.ops),
93 .view = col_at.view->btv.raw,
94 .usage = GPU_TEXTURE_USE_COLOR_TARGET,
95 .format = col_at.view->desc.format,
98 if (desc.depth_stencil_attachment.view) {
103 VkRenderPass renderpass;
104 VkFramebuffer framebuffer;
105 if (!vk_device_create_renderpass(device, rp_key, &renderpass)
106 || !vk_device_create_framebuffer(device, fb_key, renderpass, &framebuffer)) {
110 vk_device_set_object_name(device->logical, VK_OBJECT_TYPE_RENDER_PASS, renderpass, desc.label);
112 VkRect2D render_area = {
113 .offset = { .x = 0, .y = 0 },
115 .width = (u32) desc.extent.width,
116 .height = (u32) desc.extent.height,
119 VkViewport viewport = {
122 .width = (f32) desc.extent.width,
123 .height = (f32) desc.extent.height,
128 VkRenderPassBeginInfo rp_begin_info = {
129 .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
130 .renderPass = renderpass,
131 .framebuffer = framebuffer,
132 .renderArea = render_area,
133 .clearValueCount = clear_value_count,
134 .pClearValues = clear_values,
137 vkCmdSetViewport(encoder->buffer, 0, 1, &viewport);
138 vkCmdSetScissor(encoder->buffer, 0, 1, &render_area);
139 vkCmdBeginRenderPass(encoder->buffer, &rp_begin_info, VK_SUBPASS_CONTENTS_INLINE);
144 vkCmdBindPipeline(encoder->bce.buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->bp.raw);
147 VkDeviceSize offset = 0;
152 vkCmdBindVertexBuffers(encoder->bce.buffer, (u32) slot, 1u, &buffer->bb.raw, &offset);
156 vkCmdBindIndexBuffer(encoder->bce.buffer, buffer->bb.raw, offset, vk_convert_index_format(format));
161 usize instance_count,
163 usize first_instance) {
164 vkCmdDraw(encoder->bce.buffer, (u32) vertex_count, (u32) instance_count, (u32) first_vertex, (u32) first_instance);
171 usize first_instance,
172 usize instance_count) {
173 vkCmdDrawIndexed(encoder->bce.buffer,
175 (u32) instance_count,
178 (u32) first_instance);
182 vkCmdEndRenderPass(encoder->buffer);
187 #ifdef KB_DEBUG_BUILD
188 VkDebugUtilsLabelEXT info = {
189 .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
192 (f32) encoder->desc.debug_color.r,
193 (f32) encoder->desc.debug_color.g,
194 (f32) encoder->desc.debug_color.b,
195 (f32) encoder->desc.debug_color.a,
198 vk_instance.cmdBeginDebugUtilsLabel(encoder->bce.buffer, &info);
206 #ifdef KB_DEBUG_BUILD
207 VkDebugUtilsLabelEXT info = {
208 .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
211 (f32) encoder->desc.debug_color.r,
212 (f32) encoder->desc.debug_color.g,
213 (f32) encoder->desc.debug_color.b,
214 (f32) encoder->desc.debug_color.a,
217 vk_instance.cmdInsertDebugUtilsLabel(encoder->bce.buffer, &info);
225 #ifdef KB_DEBUG_BUILD
226 vk_instance.cmdEndDebugUtilsLabel(encoder->bce.buffer);
233 VK_CALL_B8(vkEndCommandBuffer(encoder->buffer));
239 VkImageMemoryBarrier vk_barriers[32] = { 0 };
240 u32 vk_barrier_count = 0;
241 VkPipelineStageFlags src_stage = 0;
242 VkPipelineStageFlags dst_stage = 0;
244 VkImageSubresourceRange subresource_range = {
245 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
251 VkImageLayout src = vk_optimal_image_layout(bar->source_use, bar->format);
252 VkImageLayout dst = vk_optimal_image_layout(bar->target_use, bar->format);
253 VkAccessFlags src_access = 0;
254 VkAccessFlags dst_access = 0;
255 vk_map_texture_use_to_barrier_flags(bar->source_use, &src_stage, &src_access);
256 vk_map_texture_use_to_barrier_flags(bar->target_use, &dst_stage, &dst_access);
257 VkImageMemoryBarrier barrier = {
258 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
261 .image = bar->tex->raw,
262 .subresourceRange = subresource_range,
263 .srcAccessMask = src_access,
264 .dstAccessMask = dst_access,
266 vk_barriers[vk_barrier_count++] = barrier;
269 vkCmdPipelineBarrier(encoder->buffer,
284 VkBufferMemoryBarrier vk_barriers[32] = { 0 };
285 u32 vk_barrier_count = 0;
286 VkPipelineStageFlags src_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
287 VkPipelineStageFlags dst_stage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
289 VkAccessFlags src_access = 0;
290 VkAccessFlags dst_access = 0;
291 vk_map_buffer_use_to_barrier_flags(bar->source_usage, &src_stage, &src_access);
292 vk_map_buffer_use_to_barrier_flags(bar->target_usage, &dst_stage, &dst_access);
293 VkBufferMemoryBarrier barrier = {
294 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
295 .buffer = bar->buf->raw,
296 .size = VK_WHOLE_SIZE,
297 .srcAccessMask = src_access,
298 .dstAccessMask = dst_access,
300 vk_barriers[vk_barrier_count++] = barrier;
303 vkCmdPipelineBarrier(encoder->buffer,
#define UNUSED(x)
Mark parameter as unused.
#define KB_NULL
Value of an invalid ptr (nullptr).
#define KB_ERROR(...)
Log entry with error log level.