zengine/engine/modules/render/vulkan/src/vulkan_context.cpp

85 lines
3.0 KiB
C++

#include "vkn/vulkan_context.h"
#include "vkn/backend.h"
#include "zlog.h"
namespace vkn {
void VulkanContext::SetScissor(uint32_t x, uint32_t y, uint32_t width, uint32_t height)
{
VkRect2D scissor = {
.offset{ .x = (int32_t)x, .y = (int32_t)y},
.extent {.width = width,.height = height}
};
vkCmdSetScissor(command, 0, 1, &scissor);
}
void VulkanContext::SetViewport(float x, float y, float width, float height, float min_depth, float max_depth)
{
VkViewport viewport = {
.x = x,
.y = y,
.width = width,
.height = height,
.minDepth = min_depth,
.maxDepth = max_depth
};
vkCmdSetViewport(command, 0, 1, &viewport);
}
void VulkanContext::BindIndexBuffer(BufferDesc desc, uint32_t index_stride)
{
VkIndexType vk_index_type =
(sizeof(uint16_t) == index_stride) ?
VK_INDEX_TYPE_UINT16 : ((sizeof(uint8_t) == index_stride) ? VK_INDEX_TYPE_UINT8_EXT : VK_INDEX_TYPE_UINT32);
vkCmdBindIndexBuffer(command, (VkBuffer)desc.buffer, 0, vk_index_type);
}
void VulkanContext::BindVertexBuffer(BufferDesc desc)
{
VkBuffer vertexBuffers[] = { (VkBuffer)desc.buffer };
VkDeviceSize offsets[] = { 0 };
vkCmdBindVertexBuffers(command, 0, 1, vertexBuffers, offsets);
}
void VulkanContext::BindVertexBuffers(uint32_t buffer_count, const BufferDesc* descs, const uint32_t* offsets)
{
VkBuffer vkBuffers[MAX_BUFFER_BIND_NUM] = { 0 };
VkDeviceSize vkOffsets[MAX_BUFFER_BIND_NUM] = { 0 };
for (uint32_t i = 0; i < buffer_count; i++) {
vkBuffers[i] = (VkBuffer)descs[i].buffer;
vkOffsets[i] = offsets[i];
}
vkCmdBindVertexBuffers(command, 0, buffer_count, vkBuffers, vkOffsets);
}
void VulkanContext::DrawIndexed(uint32_t index_count, uint32_t first_index, uint32_t first_vertex)
{
vkCmdDrawIndexed(command, index_count, 1, first_index, first_vertex, 0);
}
void VulkanContext::BeginRecord(VkCommandBufferUsageFlags flag)
{
VkCommandBufferBeginInfo beginInfo{
VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,//sType
nullptr, //pNext
flag //flags
};
vkBeginCommandBuffer(surfaceCommand, &beginInfo);
}
void VulkanContext::EndRecord(VkQueue queue)
{
vkEndCommandBuffer(surfaceCommand);
VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT }; // 等待渲染阶段
VkSemaphore waitSemaphores[] = { graphSemaphore ? graphSemaphore : surfaceSemaphore };
VkSemaphore signalSemaphores[] = { presentSemaphore };// 渲染完成信号量
VkSubmitInfo submitInfo{};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &surfaceCommand;
submitInfo.waitSemaphoreCount = 1;
submitInfo.pWaitSemaphores = waitSemaphores;
submitInfo.pWaitDstStageMask = waitStages;
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = signalSemaphores;
//zlog::info("-----wait {:#x}", (uintptr_t)waitSemaphores[0]);
//zlog::info("+++++sign {:#x}", (uintptr_t)signalSemaphores[0]);
vkQueueSubmit(queue, 1, &submitInfo, surfaceFence);
graphSemaphore = nullptr;
}
}