working RT
This commit is contained in:
parent
e4e7c66808
commit
8b2fd773b1
6 changed files with 52 additions and 53 deletions
|
|
@ -36,6 +36,41 @@ int main() {
|
||||||
RenderingElement3DVulkan::elements.emplace_back(triangleMesh);
|
RenderingElement3DVulkan::elements.emplace_back(triangleMesh);
|
||||||
RenderingElement3DVulkan::BuildTLAS(cmd);
|
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.
|
FinishInit executes all commands recorded to StartInit.
|
||||||
This must be called before the the event loops starts if you called StartInit before.
|
This must be called before the the event loops starts if you called StartInit before.
|
||||||
|
|
|
||||||
|
|
@ -301,6 +301,7 @@ void VulkanDevice::CreateDevice() {
|
||||||
vkGetAccelerationStructureDeviceAddressKHR = reinterpret_cast<PFN_vkGetAccelerationStructureDeviceAddressKHR>(vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureDeviceAddressKHR"));
|
vkGetAccelerationStructureDeviceAddressKHR = reinterpret_cast<PFN_vkGetAccelerationStructureDeviceAddressKHR>(vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureDeviceAddressKHR"));
|
||||||
vkCreateRayTracingPipelinesKHR = reinterpret_cast<PFN_vkCreateRayTracingPipelinesKHR>(vkGetInstanceProcAddr(instance, "vkCreateRayTracingPipelinesKHR"));
|
vkCreateRayTracingPipelinesKHR = reinterpret_cast<PFN_vkCreateRayTracingPipelinesKHR>(vkGetInstanceProcAddr(instance, "vkCreateRayTracingPipelinesKHR"));
|
||||||
vkGetRayTracingShaderGroupHandlesKHR = reinterpret_cast<PFN_vkGetRayTracingShaderGroupHandlesKHR>(vkGetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupHandlesKHR"));
|
vkGetRayTracingShaderGroupHandlesKHR = reinterpret_cast<PFN_vkGetRayTracingShaderGroupHandlesKHR>(vkGetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupHandlesKHR"));
|
||||||
|
vkCmdTraceRaysKHR = reinterpret_cast<PFN_vkCmdTraceRaysKHR>(vkGetInstanceProcAddr(instance, "vkCmdTraceRaysKHR"));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::uint32_t VulkanDevice::GetMemoryType(uint32_t typeBits, VkMemoryPropertyFlags properties) {
|
std::uint32_t VulkanDevice::GetMemoryType(uint32_t typeBits, VkMemoryPropertyFlags properties) {
|
||||||
|
|
|
||||||
|
|
@ -148,12 +148,12 @@ void WindowVulkan::CreateSwapchain()
|
||||||
|
|
||||||
// Enable transfer source on swap chain images if supported
|
// Enable transfer source on swap chain images if supported
|
||||||
if (surfCaps.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
|
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
|
// Enable transfer destination on swap chain images if supported
|
||||||
if (surfCaps.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
|
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));
|
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 = {};
|
VkAttachmentReference colorReference = {};
|
||||||
colorReference.attachment = 0;
|
colorReference.attachment = 0;
|
||||||
colorReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
colorReference.layout = VK_IMAGE_LAYOUT_GENERAL;
|
||||||
|
|
||||||
VkSubpassDescription subpassDescription = {};
|
VkSubpassDescription subpassDescription = {};
|
||||||
subpassDescription.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
subpassDescription.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||||
|
|
@ -405,9 +405,6 @@ void WindowVulkan::Render() {
|
||||||
range.baseArrayLayer = 0;
|
range.baseArrayLayer = 0;
|
||||||
range.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
range.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||||
|
|
||||||
VkImageSubresourceRange depth_range{range};
|
|
||||||
depth_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
|
|
||||||
|
|
||||||
image_layout_transition(drawCmdBuffers[currentBuffer],
|
image_layout_transition(drawCmdBuffers[currentBuffer],
|
||||||
images[currentBuffer],
|
images[currentBuffer],
|
||||||
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||||
|
|
@ -415,43 +412,11 @@ void WindowVulkan::Render() {
|
||||||
0,
|
0,
|
||||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
VK_IMAGE_LAYOUT_GENERAL,
|
||||||
range);
|
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<std::uint32_t>(width), static_cast<std::uint32_t>(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<float>(width);
|
|
||||||
viewport.height = static_cast<float>(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);
|
vkCmdBindPipeline(drawCmdBuffers[currentBuffer], VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, rtPipeline);
|
||||||
VkBindDescriptorSetsInfo bindDescriptorSetsInfo{
|
VkBindDescriptorSetsInfo bindDescriptorSetsInfo{
|
||||||
.sType = VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO,
|
.sType = VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO,
|
||||||
|
|
@ -463,13 +428,11 @@ void WindowVulkan::Render() {
|
||||||
};
|
};
|
||||||
|
|
||||||
vkCmdBindDescriptorSets2(drawCmdBuffers[currentBuffer], &bindDescriptorSetsInfo);
|
vkCmdBindDescriptorSets2(drawCmdBuffers[currentBuffer], &bindDescriptorSetsInfo);
|
||||||
//vkCmdTraceRaysKHR(drawCmdBuffers[currentBuffer], &raygenRegion, &missRegion, &hitRegion, &callableRegion, width, height, 1);
|
VulkanDevice::vkCmdTraceRaysKHR(drawCmdBuffers[currentBuffer], &raygenRegion, &missRegion, &hitRegion, &callableRegion, width, height, 1);
|
||||||
|
|
||||||
VulkanDevice::vkCmdEndRenderingKHRProc(drawCmdBuffers[currentBuffer]);
|
|
||||||
|
|
||||||
image_layout_transition(drawCmdBuffers[currentBuffer],
|
image_layout_transition(drawCmdBuffers[currentBuffer],
|
||||||
images[currentBuffer],
|
images[currentBuffer],
|
||||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
VK_IMAGE_LAYOUT_GENERAL,
|
||||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||||
range
|
range
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ export namespace Crafter {
|
||||||
inline static PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR;
|
inline static PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR;
|
||||||
inline static PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR;
|
inline static PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR;
|
||||||
inline static PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR;
|
inline static PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR;
|
||||||
|
inline static PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR;
|
||||||
inline static VkPhysicalDeviceMemoryProperties memoryProperties;
|
inline static VkPhysicalDeviceMemoryProperties memoryProperties;
|
||||||
inline static VkPhysicalDeviceRayTracingPipelinePropertiesKHR rayTracingProperties = {
|
inline static VkPhysicalDeviceRayTracingPipelinePropertiesKHR rayTracingProperties = {
|
||||||
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR
|
||||||
|
|
|
||||||
|
|
@ -53,8 +53,8 @@ export namespace Crafter {
|
||||||
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
|
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
|
||||||
return VK_ACCESS_TRANSFER_WRITE_BIT;
|
return VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||||
case VK_IMAGE_LAYOUT_GENERAL:
|
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!");
|
//assert(false && "Don't know how to get a meaningful VkAccessFlags for VK_IMAGE_LAYOUT_GENERAL! Don't use it!");
|
||||||
return 0;
|
return VK_ACCESS_SHADER_WRITE_BIT;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -83,8 +83,8 @@ export namespace Crafter {
|
||||||
case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
|
case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
|
||||||
return VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
return VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
||||||
case VK_IMAGE_LAYOUT_GENERAL:
|
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!");
|
//assert(false && "Don't know how to get a meaningful VkPipelineStageFlags for VK_IMAGE_LAYOUT_GENERAL! Don't use it!");
|
||||||
return 0;
|
return VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -380,7 +380,6 @@ export namespace Crafter {
|
||||||
constexpr static wp_fractional_scale_v1_listener wp_fractional_scale_v1_listener = {
|
constexpr static wp_fractional_scale_v1_listener wp_fractional_scale_v1_listener = {
|
||||||
.preferred_scale = xdg_surface_handle_preferred_scale,
|
.preferred_scale = xdg_surface_handle_preferred_scale,
|
||||||
};
|
};
|
||||||
private:
|
|
||||||
void CreateSwapchain();
|
void CreateSwapchain();
|
||||||
VkSurfaceKHR vulkanSurface = VK_NULL_HANDLE;
|
VkSurfaceKHR vulkanSurface = VK_NULL_HANDLE;
|
||||||
VkSwapchainKHR swapChain = VK_NULL_HANDLE;
|
VkSwapchainKHR swapChain = VK_NULL_HANDLE;
|
||||||
|
|
@ -390,7 +389,7 @@ export namespace Crafter {
|
||||||
std::vector<VkImageView> imageViews;
|
std::vector<VkImageView> imageViews;
|
||||||
std::thread thread;
|
std::thread thread;
|
||||||
std::vector<VkCommandBuffer> drawCmdBuffers;
|
std::vector<VkCommandBuffer> drawCmdBuffers;
|
||||||
std::vector<VkFramebuffer> frameBuffers;
|
//std::vector<VkFramebuffer> frameBuffers;
|
||||||
VkSubmitInfo submitInfo;
|
VkSubmitInfo submitInfo;
|
||||||
Semaphores semaphores;
|
Semaphores semaphores;
|
||||||
uint32_t currentBuffer = 0;
|
uint32_t currentBuffer = 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue