diff --git a/src/graphics/device.cpp b/src/graphics/device.cpp index 087e0b8..21c2354 100644 --- a/src/graphics/device.cpp +++ b/src/graphics/device.cpp @@ -186,10 +186,6 @@ bool device_evaluate(GraphicsDevice* g, VkPhysicalDevice device) // Maximum possible size of textures affects graphics quality score += deviceProperties.limits.maxImageDimension2D; - // Application won't function without geometry shaders - if (!deviceFeatures.geometryShader) - return 0; - // Ensure that the device can process the graphics commands that we need QueueFamilyIndices indices = device_get_queue_families(g, device); if (!indices.isComplete()) diff --git a/src/graphics/device.hpp b/src/graphics/device.hpp index 703590b..f0c9c71 100644 --- a/src/graphics/device.hpp +++ b/src/graphics/device.hpp @@ -6,7 +6,7 @@ namespace inferno::graphics { -#define VALIDATION_LAYERS_ENABLED 1 +// #define VALIDATION_LAYERS_ENABLED 1 #ifdef VALIDATION_LAYERS_ENABLED const std::vector VALIDATION_LAYERS = { "VK_LAYER_KHRONOS_validation", @@ -16,8 +16,6 @@ const std::vector VALIDATION_LAYERS = { const std::vector DEVICE_EXTENSIONS = { VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, - VK_EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_EXTENSION_NAME, - VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, }; typedef struct GraphicsDevice { diff --git a/src/graphics/image.cpp b/src/graphics/image.cpp new file mode 100644 index 0000000..27fc3ae --- /dev/null +++ b/src/graphics/image.cpp @@ -0,0 +1,101 @@ +#include "graphics/image.hpp" + +#include "device.hpp" + +#include "yolo/yolo.hpp" + +namespace inferno::graphics { + +void create_image(GraphicsDevice* device, uint32_t width, uint32_t height, + VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, + VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory) +{ + VkImageCreateInfo imageInfo {}; + imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + imageInfo.imageType = VK_IMAGE_TYPE_2D; + imageInfo.extent.width = width; + imageInfo.extent.height = height; + imageInfo.extent.depth = 1; + imageInfo.mipLevels = 1; + imageInfo.arrayLayers = 1; + imageInfo.format = format; + imageInfo.tiling = tiling; + imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + imageInfo.usage = usage; + imageInfo.samples = VK_SAMPLE_COUNT_1_BIT; + imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + if (vkCreateImage(device->VulkanDevice, &imageInfo, nullptr, &image) != VK_SUCCESS) { + yolo::error("failed to create image!"); + } + + VkMemoryRequirements memRequirements; + vkGetImageMemoryRequirements(device->VulkanDevice, image, &memRequirements); + + VkMemoryAllocateInfo allocInfo {}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex + = device_find_memory_type(device, memRequirements.memoryTypeBits, properties); + + if (vkAllocateMemory(device->VulkanDevice, &allocInfo, nullptr, &imageMemory) + != VK_SUCCESS) { + yolo::error("failed to allocate image memory!"); + } + + vkBindImageMemory(device->VulkanDevice, image, imageMemory, 0); +} + +VkImageView create_image_view(GraphicsDevice* device, VkImage image, VkFormat format, + VkImageAspectFlags aspectFlags) +{ + VkImageViewCreateInfo viewInfo {}; + viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + viewInfo.image = image; + viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; + viewInfo.format = format; + viewInfo.subresourceRange.aspectMask = aspectFlags; + viewInfo.subresourceRange.baseMipLevel = 0; + viewInfo.subresourceRange.levelCount = 1; + viewInfo.subresourceRange.baseArrayLayer = 0; + viewInfo.subresourceRange.layerCount = 1; + + VkImageView imageView; + if (vkCreateImageView(device->VulkanDevice, &viewInfo, nullptr, &imageView) + != VK_SUCCESS) { + yolo::error("failed to create texture image view!"); + } + + return imageView; +} + +VkFormat find_format(GraphicsDevice* device, const std::vector& candidates, + VkImageTiling tiling, VkFormatFeatureFlags features) +{ + for (VkFormat format : candidates) { + VkFormatProperties props; + vkGetPhysicalDeviceFormatProperties(device->VulkanPhysicalDevice, format, &props); + + if (tiling == VK_IMAGE_TILING_LINEAR + && (props.linearTilingFeatures & features) == features) { + return format; + } else if (tiling == VK_IMAGE_TILING_OPTIMAL + && (props.optimalTilingFeatures & features) == features) { + return format; + } + } + + throw std::runtime_error("failed to find supported format!"); +} + +VkFormat find_depth_format(GraphicsDevice* device) +{ + return VK_FORMAT_D32_SFLOAT_S8_UINT; + return find_format(device, + { VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT }, + VK_IMAGE_TILING_OPTIMAL, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT); + +} + + +} diff --git a/src/graphics/image.hpp b/src/graphics/image.hpp new file mode 100644 index 0000000..1018bfe --- /dev/null +++ b/src/graphics/image.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "graphics.hpp" + +namespace inferno::graphics { + +struct GraphicsDevice; + +void create_image(GraphicsDevice* device, uint32_t width, uint32_t height, + VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, + VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory); + +VkImageView create_image_view(GraphicsDevice* device, VkImage image, VkFormat format, + VkImageAspectFlags aspectFlags); + +VkFormat find_format(GraphicsDevice* device, const std::vector& candidates, + VkImageTiling tiling, VkFormatFeatureFlags features); +VkFormat find_depth_format(GraphicsDevice* device); + +} diff --git a/src/graphics/rendertarget.cpp b/src/graphics/rendertarget.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/graphics/rendertarget.hpp b/src/graphics/rendertarget.hpp new file mode 100644 index 0000000..9534134 --- /dev/null +++ b/src/graphics/rendertarget.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include "graphics.hpp" + +#include + +namespace inferno::graphics { + +struct GraphicsDevice; + +// TODO: What about the present mode? +typedef struct RenderTarget { + VkImage Image; + VkDeviceMemory Memory; + VkImageView ImageView; + + std::optional DepthImage; + std::optional DepthMemory; + std::optional DepthImageView; + + VkFormat Format; + VkExtent2D Extent; + + GraphicsDevice* Device; +} RenderTarget; + +RenderTarget* rendertarget_create(GraphicsDevice* device, VkExtent2D extent, VkFormat format); +void rendertarget_cleanup(RenderTarget* target); + +void rendertarget_create_depth(RenderTarget* target); +void rendertarget_destroy_depth(RenderTarget* target); + +void rendertarget_recreate(RenderTarget* target, VkExtent2D extent, VkFormat format); + +} diff --git a/src/graphics/swapchain.cpp b/src/graphics/swapchain.cpp index 319fb20..2cbd105 100644 --- a/src/graphics/swapchain.cpp +++ b/src/graphics/swapchain.cpp @@ -3,6 +3,7 @@ #include "graphics.hpp" #include "device.hpp" +#include "image.hpp" #include "yolo/yolo.hpp" @@ -44,97 +45,6 @@ SwapChainSupportDetails device_get_swapchain_support( return details; } -void create_image(GraphicsDevice* device, uint32_t width, uint32_t height, - VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, - VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory) -{ - VkImageCreateInfo imageInfo {}; - imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; - imageInfo.imageType = VK_IMAGE_TYPE_2D; - imageInfo.extent.width = width; - imageInfo.extent.height = height; - imageInfo.extent.depth = 1; - imageInfo.mipLevels = 1; - imageInfo.arrayLayers = 1; - imageInfo.format = format; - imageInfo.tiling = tiling; - imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - imageInfo.usage = usage; - imageInfo.samples = VK_SAMPLE_COUNT_1_BIT; - imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - - if (vkCreateImage(device->VulkanDevice, &imageInfo, nullptr, &image) != VK_SUCCESS) { - throw std::runtime_error("failed to create image!"); - } - - VkMemoryRequirements memRequirements; - vkGetImageMemoryRequirements(device->VulkanDevice, image, &memRequirements); - - VkMemoryAllocateInfo allocInfo {}; - allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - allocInfo.allocationSize = memRequirements.size; - allocInfo.memoryTypeIndex - = device_find_memory_type(device, memRequirements.memoryTypeBits, properties); - - if (vkAllocateMemory(device->VulkanDevice, &allocInfo, nullptr, &imageMemory) - != VK_SUCCESS) { - throw std::runtime_error("failed to allocate image memory!"); - } - - vkBindImageMemory(device->VulkanDevice, image, imageMemory, 0); -} - -VkImageView create_image_view(GraphicsDevice* device, VkImage image, VkFormat format, - VkImageAspectFlags aspectFlags) -{ - VkImageViewCreateInfo viewInfo {}; - viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - viewInfo.image = image; - viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; - viewInfo.format = format; - viewInfo.subresourceRange.aspectMask = aspectFlags; - viewInfo.subresourceRange.baseMipLevel = 0; - viewInfo.subresourceRange.levelCount = 1; - viewInfo.subresourceRange.baseArrayLayer = 0; - viewInfo.subresourceRange.layerCount = 1; - - VkImageView imageView; - if (vkCreateImageView(device->VulkanDevice, &viewInfo, nullptr, &imageView) - != VK_SUCCESS) { - yolo::error("failed to create texture image view!"); - } - - return imageView; -} - -VkFormat find_format(GraphicsDevice* device, const std::vector& candidates, - VkImageTiling tiling, VkFormatFeatureFlags features) -{ - for (VkFormat format : candidates) { - VkFormatProperties props; - vkGetPhysicalDeviceFormatProperties(device->VulkanPhysicalDevice, format, &props); - - if (tiling == VK_IMAGE_TILING_LINEAR - && (props.linearTilingFeatures & features) == features) { - return format; - } else if (tiling == VK_IMAGE_TILING_OPTIMAL - && (props.optimalTilingFeatures & features) == features) { - return format; - } - } - - throw std::runtime_error("failed to find supported format!"); -} - -VkFormat find_depth_format(GraphicsDevice* device) -{ - // depth and stencil format - return VK_FORMAT_D32_SFLOAT_S8_UINT; - // return find_format(device, { VK_FORMAT_D, VK_FORMAT_D32_SFLOAT_S8_UINT, - // VK_FORMAT_D24_UNORM_S8_UINT }, - // VK_IMAGE_TILING_OPTIMAL, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT); -} - VkSurfaceFormatKHR device_choose_swap_surface_format( const std::vector& availableFormats) { diff --git a/src/graphics/vkrenderer.cpp b/src/graphics/vkrenderer.cpp index 2b21de6..fce81c8 100644 --- a/src/graphics/vkrenderer.cpp +++ b/src/graphics/vkrenderer.cpp @@ -49,11 +49,11 @@ VulkanRenderer* renderer_create(GraphicsDevice* device) renderer->CurrentFrameIndex = 0; renderer->CurrentFrame = &renderer->InFlight[0]; - gui::imgui_init(renderer); - return renderer; } +void renderer_configure_gui(VulkanRenderer* renderer) { gui::imgui_init(renderer); } + void renderer_cleanup(VulkanRenderer* renderer) { vkDestroyCommandPool( @@ -101,55 +101,6 @@ void renderer_record_command_buffer(VulkanRenderer* renderer, uint32_t imageInde renderer->CommandBufferInFlight = &renderer->CommandBuffersInFlight[renderer->CurrentFrameIndex]; - - VkImageMemoryBarrier imageMemoryBarrier {}; - imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - imageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - imageMemoryBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; - imageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - imageMemoryBarrier.image = renderer->Swap->Images[renderer->ImageIndex]; - imageMemoryBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - imageMemoryBarrier.subresourceRange.baseMipLevel = 0; - imageMemoryBarrier.subresourceRange.layerCount = 1; - imageMemoryBarrier.subresourceRange.baseArrayLayer = 0; - imageMemoryBarrier.subresourceRange.levelCount = 1; - - vkCmdPipelineBarrier(renderer->CommandBuffersInFlight[renderer->CurrentFrameIndex], - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - 0, 0, nullptr, 0, nullptr, 1, &imageMemoryBarrier); - - VkClearValue clearColor = { { { 0.0f, 0.0f, 0.0f, 1.0f } } }; - VkRenderingAttachmentInfo attachmentInfo {}; - attachmentInfo.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR; - attachmentInfo.imageView = renderer->Swap->ImageViews[imageIndex]; - attachmentInfo.imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR; - attachmentInfo.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - attachmentInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - attachmentInfo.clearValue = clearColor; - - VkRenderingAttachmentInfo depthAttachmentInfo; - depthAttachmentInfo.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR; - depthAttachmentInfo.imageView = renderer->Swap->DepthImageView; - depthAttachmentInfo.imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR; - depthAttachmentInfo.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - depthAttachmentInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - depthAttachmentInfo.clearValue.depthStencil = { 1.0f, 0 }; - depthAttachmentInfo.resolveMode = VK_RESOLVE_MODE_NONE; - depthAttachmentInfo.resolveImageView = VK_NULL_HANDLE; - depthAttachmentInfo.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL; - depthAttachmentInfo.pNext = VK_NULL_HANDLE; - - VkRenderingInfo renderingInfo {}; - renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR; - renderingInfo.renderArea - = { 0, 0, renderer->Swap->Extent.width, renderer->Swap->Extent.height }; - renderingInfo.layerCount = 1; - renderingInfo.colorAttachmentCount = 1; - renderingInfo.pColorAttachments = &attachmentInfo; - renderingInfo.pDepthAttachment = &depthAttachmentInfo; - - vkCmdBeginRendering( - renderer->CommandBuffersInFlight[renderer->CurrentFrameIndex], &renderingInfo); } void renderer_submit_oneoff(VulkanRenderer* renderer, @@ -242,18 +193,63 @@ bool renderer_begin_frame(VulkanRenderer* renderer) work_queue(renderer, &renderer->SubmitQueueOneOffPreFrame, true); work_queue(renderer, &renderer->SubmitQueuePreFrame, false); - gui::imgui_new_frame(); - return true; } -bool renderer_draw_frame(VulkanRenderer* renderer) +void renderer_begin_pass(VulkanRenderer* renderer, VkRect2D renderArea, bool depth) { - work_queue(renderer, &renderer->SubmitQueueOneOffPreFrame, true); - work_queue(renderer, &renderer->SubmitQueuePreFrame, false); + VkImageMemoryBarrier imageMemoryBarrier {}; + imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + imageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + imageMemoryBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + imageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + imageMemoryBarrier.image = renderer->Swap->Images[renderer->ImageIndex]; + imageMemoryBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + imageMemoryBarrier.subresourceRange.baseMipLevel = 0; + imageMemoryBarrier.subresourceRange.layerCount = 1; + imageMemoryBarrier.subresourceRange.baseArrayLayer = 0; + imageMemoryBarrier.subresourceRange.levelCount = 1; - gui::imgui_render_frame(*renderer->CommandBufferInFlight); + vkCmdPipelineBarrier(renderer->CommandBuffersInFlight[renderer->CurrentFrameIndex], + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + 0, 0, nullptr, 0, nullptr, 1, &imageMemoryBarrier); + VkClearValue clearColor = { { { 0.0f, 0.0f, 0.0f, 1.0f } } }; + VkRenderingAttachmentInfo attachmentInfo {}; + attachmentInfo.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR; + attachmentInfo.imageView = renderer->Swap->ImageViews[renderer->ImageIndex]; + attachmentInfo.imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR; + attachmentInfo.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + attachmentInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + attachmentInfo.clearValue = clearColor; + + VkRenderingAttachmentInfo depthAttachmentInfo; + depthAttachmentInfo.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR; + depthAttachmentInfo.imageView = renderer->Swap->DepthImageView; + depthAttachmentInfo.imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR; + depthAttachmentInfo.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + depthAttachmentInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + depthAttachmentInfo.clearValue.depthStencil = { 1.0f, 0 }; + depthAttachmentInfo.resolveMode = VK_RESOLVE_MODE_NONE; + depthAttachmentInfo.resolveImageView = VK_NULL_HANDLE; + depthAttachmentInfo.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL; + depthAttachmentInfo.pNext = VK_NULL_HANDLE; + + VkRenderingInfo renderingInfo {}; + renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR; + renderingInfo.renderArea = renderArea; + renderingInfo.layerCount = 1; + renderingInfo.colorAttachmentCount = 1; + renderingInfo.pColorAttachments = &attachmentInfo; + if (depth) + renderingInfo.pDepthAttachment = &depthAttachmentInfo; + + vkCmdBeginRendering( + renderer->CommandBuffersInFlight[renderer->CurrentFrameIndex], &renderingInfo); +} + +void renderer_end_pass(VulkanRenderer* renderer) +{ vkCmdEndRendering(*renderer->CommandBufferInFlight); VkImageMemoryBarrier imageMemoryBarrier {}; @@ -273,6 +269,13 @@ bool renderer_draw_frame(VulkanRenderer* renderer) VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &imageMemoryBarrier); + // return VkImage +} + +bool renderer_draw_frame(VulkanRenderer* renderer) +{ + work_queue(renderer, &renderer->SubmitQueueOneOffPostFrame, true); + work_queue(renderer, &renderer->SubmitQueuePostFrame, false); if (vkEndCommandBuffer(renderer->CommandBuffersInFlight[renderer->CurrentFrameIndex]) != VK_SUCCESS) { diff --git a/src/graphics/vkrenderer.hpp b/src/graphics/vkrenderer.hpp index 258d51e..89c63f7 100644 --- a/src/graphics/vkrenderer.hpp +++ b/src/graphics/vkrenderer.hpp @@ -4,6 +4,7 @@ #include #include +#include namespace inferno::graphics { @@ -52,6 +53,7 @@ typedef struct VulkanRenderer { VulkanRenderer* renderer_create(GraphicsDevice* device); void renderer_cleanup(VulkanRenderer* renderer); +void renderer_configure_gui(VulkanRenderer* renderer); void renderer_configure_command_buffer(VulkanRenderer* renderer); void renderer_submit_oneoff(VulkanRenderer* renderer, @@ -61,8 +63,11 @@ void renderer_submit_repeat(VulkanRenderer* renderer, void renderer_submit_now(VulkanRenderer* renderer, std::function callback); - bool renderer_begin_frame(VulkanRenderer* renderer); + +void renderer_begin_pass(VulkanRenderer* renderer, VkRect2D renderArea, bool depth = true); +void renderer_end_pass(VulkanRenderer* renderer); + bool renderer_draw_frame(VulkanRenderer* renderer); } diff --git a/src/inferno.cpp b/src/inferno.cpp index a8e64e5..a7dd51a 100644 --- a/src/inferno.cpp +++ b/src/inferno.cpp @@ -1,5 +1,6 @@ #include "inferno.hpp" +#include #include #include @@ -95,6 +96,25 @@ InfernoApp* inferno_create() app->Device = graphics::device_create(); app->Renderer = graphics::renderer_create(app->Device); graphics::renderer_configure_command_buffer(app->Renderer); + graphics::renderer_configure_gui(app->Renderer); + + graphics::renderer_submit_repeat( + app->Renderer, + [](graphics::VulkanRenderer* renderer, VkCommandBuffer* commandBuffer) { + gui::imgui_new_frame(); + }, + false); + graphics::renderer_submit_repeat( + app->Renderer, + [](graphics::VulkanRenderer* renderer, VkCommandBuffer* commandBuffer) { + graphics::renderer_begin_pass(renderer, + { 0, 0, (uint32_t)graphics::window_get_size().x, + (uint32_t)graphics::window_get_size().y }, + false); + gui::imgui_render_frame(*commandBuffer); + graphics::renderer_end_pass(renderer); + }, + true); app->Shader = graphics::shader_create(app->Device, app->Renderer->Swap); graphics::shader_load(app->Shader, "res/shaders/basic"); @@ -239,24 +259,6 @@ int inferno_run(InfernoApp* app) = app->Renderer->CommandBuffersInFlight[app->Renderer->CurrentFrameIndex]; uint32_t frameIndex = app->Renderer->CurrentFrameIndex; - // shader bind - graphics::shader_use(app->Shader, commandBuffer); - scene::GlobalUniformObject globalUniformObject { - .Projection = graphics::camera_get_projection(app->Scene->Camera), - .View = graphics::camera_get_view(app->Scene->Camera), - }; - - graphics::shader_update_state( - app->Shader, commandBuffer, globalUniformObject, frameIndex); - - for (auto& object : scene::scene_get_renderables(app->Scene)) { - graphics::vertex_buffer_bind(object->Meshs[0]->VertexBuffer, commandBuffer); - graphics::index_buffer_bind(object->Meshs[0]->IndexBuffer, commandBuffer); - - vkCmdDrawIndexed(commandBuffer, - object->Meshs[0]->IndexBuffer->GenericBuffer->Count, 1, 0, 0, 0); - } - if (glm::length(app->Input->MouseDelta) > 0.0f) graphics::camera_mouse_move(app->Scene->Camera, app->Input->MouseDelta, inferno_timer_get_time(app->MainTimer).count()); @@ -318,9 +320,32 @@ int inferno_run(InfernoApp* app) graphics::camera_raster_set_viewport(scene::scene_get_camera(app->Scene), { ImGui::GetWindowSize().x, ImGui::GetWindowSize().y }); // graphics::preview_set_viewport(app->PreviewRenderer, app->Scene->Camera); - // - // graphics::preview_draw(app->PreviewRenderer, app->Scene); - // graphics::debug_draw_to_target(app->Scene); + { + graphics::renderer_begin_pass(app->Renderer, + { 0, 0, (uint32_t)ImGui::GetWindowSize().x, + (uint32_t)ImGui::GetWindowSize().y }, + false); + graphics::shader_use(app->Shader, commandBuffer); + scene::GlobalUniformObject globalUniformObject { + .Projection = graphics::camera_get_projection(app->Scene->Camera), + .View = graphics::camera_get_view(app->Scene->Camera), + }; + + graphics::shader_update_state( + app->Shader, commandBuffer, globalUniformObject, frameIndex); + + for (auto& object : scene::scene_get_renderables(app->Scene)) { + graphics::vertex_buffer_bind( + object->Meshs[0]->VertexBuffer, commandBuffer); + graphics::index_buffer_bind( + object->Meshs[0]->IndexBuffer, commandBuffer); + + vkCmdDrawIndexed(commandBuffer, + object->Meshs[0]->IndexBuffer->GenericBuffer->Count, 1, 0, 0, 0); + } + + graphics::renderer_end_pass(app->Renderer); + } // ImTextureID texture = (ImTextureID)graphics::preview_get_rendered_texture( // app->PreviewRenderer);