diff --git a/examples/VulkanTriangle/main.cpp b/examples/VulkanTriangle/main.cpp index b674e90..1f7ebb3 100644 --- a/examples/VulkanTriangle/main.cpp +++ b/examples/VulkanTriangle/main.cpp @@ -36,6 +36,41 @@ int main() { RenderingElement3DVulkan::elements.emplace_back(triangleMesh); RenderingElement3DVulkan::BuildTLAS(cmd); + VkDescriptorImageInfo imageInfo = { + .imageView = window.imageViews[0], + .imageLayout = VK_IMAGE_LAYOUT_GENERAL + }; + + std::cout << pool.sets.size() << std::endl; + + VkWriteDescriptorSetAccelerationStructureKHR writeDescriptorSetAccelerationStructure { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, + .accelerationStructureCount = 1, + .pAccelerationStructures = &RenderingElement3DVulkan::accelerationStructure + }; + + VkWriteDescriptorSet write[2] = { + { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .pNext = &writeDescriptorSetAccelerationStructure, + .dstSet = pool.sets[0], + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, + .pBufferInfo = &RenderingElement3DVulkan::tlasBuffer.descriptor + }, + { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .dstSet = pool.sets[0], + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .pImageInfo = &imageInfo + } + }; + vkUpdateDescriptorSets(VulkanDevice::device, 2, write, 0, nullptr); + + /* FinishInit executes all commands recorded to StartInit. This must be called before the the event loops starts if you called StartInit before. diff --git a/implementations/Crafter.Graphics-VulkanDevice.cpp b/implementations/Crafter.Graphics-VulkanDevice.cpp index bafaae8..3b60cc4 100644 --- a/implementations/Crafter.Graphics-VulkanDevice.cpp +++ b/implementations/Crafter.Graphics-VulkanDevice.cpp @@ -301,6 +301,7 @@ void VulkanDevice::CreateDevice() { vkGetAccelerationStructureDeviceAddressKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureDeviceAddressKHR")); vkCreateRayTracingPipelinesKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateRayTracingPipelinesKHR")); vkGetRayTracingShaderGroupHandlesKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupHandlesKHR")); + vkCmdTraceRaysKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdTraceRaysKHR")); } std::uint32_t VulkanDevice::GetMemoryType(uint32_t typeBits, VkMemoryPropertyFlags properties) { diff --git a/implementations/Crafter.Graphics-Window_vulkan.cpp b/implementations/Crafter.Graphics-Window_vulkan.cpp index 8845e5d..e458467 100644 --- a/implementations/Crafter.Graphics-Window_vulkan.cpp +++ b/implementations/Crafter.Graphics-Window_vulkan.cpp @@ -148,12 +148,12 @@ void WindowVulkan::CreateSwapchain() // Enable transfer source on swap chain images if supported if (surfCaps.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) { - swapchainCI.imageUsage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + swapchainCI.imageUsage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_STORAGE_BIT; } // Enable transfer destination on swap chain images if supported if (surfCaps.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT) { - swapchainCI.imageUsage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; + swapchainCI.imageUsage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT; } VulkanDevice::CheckVkResult(vkCreateSwapchainKHR(VulkanDevice::device, &swapchainCI, nullptr, &swapChain)); @@ -284,7 +284,7 @@ WindowVulkan::WindowVulkan(std::uint32_t width, std::uint32_t height) : Window(w VkAttachmentReference colorReference = {}; colorReference.attachment = 0; - colorReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + colorReference.layout = VK_IMAGE_LAYOUT_GENERAL; VkSubpassDescription subpassDescription = {}; subpassDescription.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; @@ -405,9 +405,6 @@ void WindowVulkan::Render() { range.baseArrayLayer = 0; range.layerCount = VK_REMAINING_ARRAY_LAYERS; - VkImageSubresourceRange depth_range{range}; - depth_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; - image_layout_transition(drawCmdBuffers[currentBuffer], images[currentBuffer], VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, @@ -415,43 +412,11 @@ void WindowVulkan::Render() { 0, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, - range); + VK_IMAGE_LAYOUT_GENERAL, + range + ); - VkRenderingAttachmentInfoKHR color_attachment_info = {VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR, VK_NULL_HANDLE}; - color_attachment_info.imageView = imageViews[currentBuffer]; - color_attachment_info.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - color_attachment_info.resolveMode = VK_RESOLVE_MODE_NONE; - color_attachment_info.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - color_attachment_info.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - color_attachment_info.clearValue = { 0.0f, 0.0f, 0.2f, 1.0f }; - VkRenderingInfo render_info = {VK_STRUCTURE_TYPE_RENDERING_INFO_KHR,VK_NULL_HANDLE,0}; - render_info.renderArea = VkRect2D{VkOffset2D{}, VkExtent2D{static_cast(width), static_cast(height)}}; - render_info.viewMask = 0; - render_info.layerCount = 1; - render_info.colorAttachmentCount = 1; - render_info.pColorAttachments = &color_attachment_info; - render_info.pDepthAttachment = VK_NULL_HANDLE; - render_info.pStencilAttachment = VK_NULL_HANDLE; - - VulkanDevice::vkCmdBeginRenderingKHRProc(drawCmdBuffers[currentBuffer], &render_info); - - VkViewport viewport {}; - viewport.width = static_cast(width); - viewport.height = static_cast(height); - viewport.minDepth = 0; - viewport.maxDepth = 1; - - vkCmdSetViewport(drawCmdBuffers[currentBuffer], 0, 1, &viewport); - - VkRect2D scissor {}; - scissor.extent.width = width; - scissor.extent.height = height; - scissor.offset.x = 0; - scissor.offset.y = 0; - - vkCmdSetScissor(drawCmdBuffers[currentBuffer], 0, 1, &scissor); vkCmdBindPipeline(drawCmdBuffers[currentBuffer], VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, rtPipeline); VkBindDescriptorSetsInfo bindDescriptorSetsInfo{ .sType = VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO, @@ -463,13 +428,11 @@ void WindowVulkan::Render() { }; vkCmdBindDescriptorSets2(drawCmdBuffers[currentBuffer], &bindDescriptorSetsInfo); - //vkCmdTraceRaysKHR(drawCmdBuffers[currentBuffer], &raygenRegion, &missRegion, &hitRegion, &callableRegion, width, height, 1); - - VulkanDevice::vkCmdEndRenderingKHRProc(drawCmdBuffers[currentBuffer]); + VulkanDevice::vkCmdTraceRaysKHR(drawCmdBuffers[currentBuffer], &raygenRegion, &missRegion, &hitRegion, &callableRegion, width, height, 1); image_layout_transition(drawCmdBuffers[currentBuffer], images[currentBuffer], - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, range ); diff --git a/interfaces/Crafter.Graphics-VulkanDevice.cppm b/interfaces/Crafter.Graphics-VulkanDevice.cppm index 189428e..2d60704 100644 --- a/interfaces/Crafter.Graphics-VulkanDevice.cppm +++ b/interfaces/Crafter.Graphics-VulkanDevice.cppm @@ -46,6 +46,7 @@ export namespace Crafter { inline static PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR; inline static PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR; inline static PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR; + inline static PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR; inline static VkPhysicalDeviceMemoryProperties memoryProperties; inline static VkPhysicalDeviceRayTracingPipelinePropertiesKHR rayTracingProperties = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR diff --git a/interfaces/Crafter.Graphics-VulkanTransition.cppm b/interfaces/Crafter.Graphics-VulkanTransition.cppm index 64a8519..c81a9ce 100644 --- a/interfaces/Crafter.Graphics-VulkanTransition.cppm +++ b/interfaces/Crafter.Graphics-VulkanTransition.cppm @@ -53,8 +53,8 @@ export namespace Crafter { case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: return VK_ACCESS_TRANSFER_WRITE_BIT; case VK_IMAGE_LAYOUT_GENERAL: - assert(false && "Don't know how to get a meaningful VkAccessFlags for VK_IMAGE_LAYOUT_GENERAL! Don't use it!"); - return 0; + //assert(false && "Don't know how to get a meaningful VkAccessFlags for VK_IMAGE_LAYOUT_GENERAL! Don't use it!"); + return VK_ACCESS_SHADER_WRITE_BIT; default: assert(false); return 0; @@ -83,8 +83,8 @@ export namespace Crafter { case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR: return VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; case VK_IMAGE_LAYOUT_GENERAL: - assert(false && "Don't know how to get a meaningful VkPipelineStageFlags for VK_IMAGE_LAYOUT_GENERAL! Don't use it!"); - return 0; + //assert(false && "Don't know how to get a meaningful VkPipelineStageFlags for VK_IMAGE_LAYOUT_GENERAL! Don't use it!"); + return VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR; default: assert(false); return 0; diff --git a/interfaces/Crafter.Graphics-Window.cppm b/interfaces/Crafter.Graphics-Window.cppm index 7ef5836..67cb907 100644 --- a/interfaces/Crafter.Graphics-Window.cppm +++ b/interfaces/Crafter.Graphics-Window.cppm @@ -380,7 +380,6 @@ export namespace Crafter { constexpr static wp_fractional_scale_v1_listener wp_fractional_scale_v1_listener = { .preferred_scale = xdg_surface_handle_preferred_scale, }; - private: void CreateSwapchain(); VkSurfaceKHR vulkanSurface = VK_NULL_HANDLE; VkSwapchainKHR swapChain = VK_NULL_HANDLE; @@ -390,7 +389,7 @@ export namespace Crafter { std::vector imageViews; std::thread thread; std::vector drawCmdBuffers; - std::vector frameBuffers; + //std::vector frameBuffers; VkSubmitInfo submitInfo; Semaphores semaphores; uint32_t currentBuffer = 0;