diff --git a/ray_tracing__advance/hello_vulkan.cpp b/ray_tracing__advance/hello_vulkan.cpp index 3a25711..e0c0cb9 100644 --- a/ray_tracing__advance/hello_vulkan.cpp +++ b/ray_tracing__advance/hello_vulkan.cpp @@ -91,7 +91,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -103,20 +103,15 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); -#if defined(NVVK_ALLOC_DEDICATED) - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(CameraMatrices)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); -#elif defined(NVVK_ALLOC_DMA) - void* data = m_memAllocator.map(m_cameraMat.allocation); - memcpy(data, &ubo, sizeof(ubo)); - m_memAllocator.unmap(m_cameraMat.allocation); -#elif defined(NVVK_ALLOC_VMA) - void* data; - vmaMapMemory(m_memAllocator, m_cameraMat.allocation, &data); - memcpy(data, &ubo, sizeof(ubo)); - vmaUnmapMemory(m_memAllocator, m_cameraMat.allocation); -#endif + + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -312,12 +307,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, -#ifndef NVVK_ALLOC_VMA - vkMP::eHostVisible | vkMP::eHostCoherent); -#else - VMA_MEMORY_USAGE_CPU_TO_GPU); -#endif // _DEBUG + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -497,6 +488,7 @@ void HelloVulkan::onResize(int /*w*/, int /*h*/) m_offscreen.createFramebuffer(m_size); m_offscreen.updateDescriptorSet(); m_raytrace.updateRtDescriptorSet(m_offscreen.colorTexture().descriptor.imageView); + resetFrame(); } //-------------------------------------------------------------------------------------------------- diff --git a/ray_tracing__advance/hello_vulkan.h b/ray_tracing__advance/hello_vulkan.h index 2de4e6f..9254b83 100644 --- a/ray_tracing__advance/hello_vulkan.h +++ b/ray_tracing__advance/hello_vulkan.h @@ -61,7 +61,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing__advance/main.cpp b/ray_tracing__advance/main.cpp index a87c55a..3c6fdbc 100644 --- a/ray_tracing__advance/main.cpp +++ b/ray_tracing__advance/main.cpp @@ -148,6 +148,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), @@ -287,9 +289,6 @@ int main(int argc, char** argv) // Start the Dear ImGui frame ImGui_ImplGlfw_NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -317,9 +316,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -339,13 +341,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -358,17 +360,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - offscreen.draw(cmdBuff, helloVk.getSize()); + offscreen.draw(cmdBuf, helloVk.getSize()); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing__advance/raytrace.cpp b/ray_tracing__advance/raytrace.cpp index 4bd6492..e590c23 100644 --- a/ray_tracing__advance/raytrace.cpp +++ b/ray_tracing__advance/raytrace.cpp @@ -99,10 +99,10 @@ nvvk::RaytracingBuilderKHR::BlasInput Raytracer::objectToVkGeometryKHR(const Obj offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } @@ -131,10 +131,10 @@ nvvk::RaytracingBuilderKHR::BlasInput Raytracer::implicitToVkGeometryKHR( offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } diff --git a/ray_tracing__before/hello_vulkan.cpp b/ray_tracing__before/hello_vulkan.cpp index 00bf5e8..66052e0 100644 --- a/ray_tracing__before/hello_vulkan.cpp +++ b/ray_tracing__before/hello_vulkan.cpp @@ -69,7 +69,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -78,9 +78,14 @@ void HelloVulkan::updateUniformBuffer() ubo.proj = nvmath::perspectiveVK(CameraManip.getFov(), aspectRatio, 0.1f, 1000.0f); //ubo.proj[1][1] *= -1; // Inverting Y for Vulkan ubo.viewInverse = nvmath::invert(ubo.view); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -248,8 +253,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } diff --git a/ray_tracing__before/hello_vulkan.h b/ray_tracing__before/hello_vulkan.h index 3b36931..6d3d028 100644 --- a/ray_tracing__before/hello_vulkan.h +++ b/ray_tracing__before/hello_vulkan.h @@ -54,7 +54,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing__before/main.cpp b/ray_tracing__before/main.cpp index d8ed7be..28c8a19 100644 --- a/ray_tracing__before/main.cpp +++ b/ray_tracing__before/main.cpp @@ -117,6 +117,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), @@ -197,9 +199,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -217,9 +216,13 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; + + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); // Clearing screen vk::ClearValue clearValues[2]; @@ -237,9 +240,9 @@ int main(int argc, char** argv) offscreenRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); // Rendering Scene - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } @@ -252,17 +255,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing__simple/hello_vulkan.cpp b/ray_tracing__simple/hello_vulkan.cpp index 6efb4aa..b91a743 100644 --- a/ray_tracing__simple/hello_vulkan.cpp +++ b/ray_tracing__simple/hello_vulkan.cpp @@ -73,7 +73,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -85,9 +85,14 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -147,12 +152,12 @@ void HelloVulkan::updateDescriptorSet() std::vector dbiMatIdx; std::vector dbiVert; std::vector dbiIdx; - for(size_t i = 0; i < m_objModel.size(); ++i) + for(auto& obj : m_objModel) { - dbiMat.push_back({m_objModel[i].matColorBuffer.buffer, 0, VK_WHOLE_SIZE}); - dbiMatIdx.push_back({m_objModel[i].matIndexBuffer.buffer, 0, VK_WHOLE_SIZE}); - dbiVert.push_back({m_objModel[i].vertexBuffer.buffer, 0, VK_WHOLE_SIZE}); - dbiIdx.push_back({m_objModel[i].indexBuffer.buffer, 0, VK_WHOLE_SIZE}); + dbiMat.emplace_back(obj.matColorBuffer.buffer, 0, VK_WHOLE_SIZE); + dbiMatIdx.emplace_back(obj.matIndexBuffer.buffer, 0, VK_WHOLE_SIZE); + dbiVert.emplace_back(obj.vertexBuffer.buffer, 0, VK_WHOLE_SIZE); + dbiIdx.emplace_back(obj.indexBuffer.buffer, 0, VK_WHOLE_SIZE); } writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 1, dbiMat.data())); writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 4, dbiMatIdx.data())); @@ -273,8 +278,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -633,44 +638,47 @@ void HelloVulkan::initRayTracing() } //-------------------------------------------------------------------------------------------------- -// Converting a OBJ primitive to the ray tracing geometry used for the BLAS +// Convert an OBJ model into the ray tracing geometry used to build the BLAS // nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - // Building part + // BLAS builder requires raw device addresses. vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); uint32_t maxPrimitiveCount = model.nbIndices / 3; + // Describe buffer as array of VertexObj. vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); // vec3 vertex position data. triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); + // Describe index data (32-bit unsigned int) triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); + // Indicate identity transform by setting transformData to null device pointer. triangles.setTransformData({}); triangles.setMaxVertex(model.nbVertices); - // Setting up the build info of the acceleration + // Identify the above data as containing opaque triangles. vk::AccelerationStructureGeometryKHR asGeom; asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); - // The primitive itself + // The entire array will be used to build the BLAS. vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); offset.setPrimitiveCount(maxPrimitiveCount); offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - // Our blas is only one geometry, but could be made of many geometries - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); + // Our blas is made from only one geometry, but could be made of many geometries + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); - return blas; + return input; } //-------------------------------------------------------------------------------------------------- @@ -832,8 +840,9 @@ void HelloVulkan::createRtPipeline() rayPipelineInfo.setStageCount(static_cast(stages.size())); // Stages are shaders rayPipelineInfo.setPStages(stages.data()); - rayPipelineInfo.setGroupCount(static_cast( - m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) + // In this case, m_rtShaderGroups.size() == 4: we have one raygen group, + // two miss shader groups, and one hit group. + rayPipelineInfo.setGroupCount(static_cast(m_rtShaderGroups.size())); rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth @@ -849,27 +858,29 @@ void HelloVulkan::createRtPipeline() //-------------------------------------------------------------------------------------------------- // The Shader Binding Table (SBT) -// - getting all shader handles and writing them in a SBT buffer +// - getting all shader handles and write them in a SBT buffer // - Besides exception, this could be always done like this // See how the SBT buffer is used in run() // void HelloVulkan::createRtShaderBindingTable() { auto groupCount = - static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit + static_cast(m_rtShaderGroups.size()); // 4 shaders: raygen, 2 miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier + // Compute the actual size needed per SBT entry (round-up to alignment needed). uint32_t groupSizeAligned = nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); - - // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT + // Bytes needed for the SBT. uint32_t sbtSize = groupCount * groupSizeAligned; + // Fetch all the shader handles used in the pipeline. This is opaque data, + // so we store it in a vector of bytes. std::vector shaderHandleStorage(sbtSize); auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, shaderHandleStorage.data()); assert(result == vk::Result::eSuccess); - // Write the handles in the SBT + // Allocate a buffer for storing the SBT. Give it a debug name for NSight. m_rtSBTBuffer = m_alloc.createBuffer( sbtSize, vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddress @@ -877,17 +888,15 @@ void HelloVulkan::createRtShaderBindingTable() vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); - // Write the handles in the SBT + // Map the SBT buffer and write in the handles. void* mapped = m_alloc.map(m_rtSBTBuffer); auto* pData = reinterpret_cast(mapped); for(uint32_t g = 0; g < groupCount; g++) { - memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen + memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); - - m_alloc.finalizeAndReleaseStaging(); } diff --git a/ray_tracing__simple/hello_vulkan.h b/ray_tracing__simple/hello_vulkan.h index 33dd335..e98f371 100644 --- a/ray_tracing__simple/hello_vulkan.h +++ b/ray_tracing__simple/hello_vulkan.h @@ -58,7 +58,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing__simple/main.cpp b/ray_tracing__simple/main.cpp index bdc39c0..da3453a 100644 --- a/ray_tracing__simple/main.cpp +++ b/ray_tracing__simple/main.cpp @@ -113,6 +113,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), @@ -217,8 +219,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); // Show UI window. if(helloVk.showGui()) @@ -240,9 +240,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -262,13 +265,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -281,17 +284,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing_animation/hello_vulkan.cpp b/ray_tracing_animation/hello_vulkan.cpp index 0924906..0a9b75e 100644 --- a/ray_tracing_animation/hello_vulkan.cpp +++ b/ray_tracing_animation/hello_vulkan.cpp @@ -73,7 +73,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -85,9 +85,14 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -272,8 +277,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -666,10 +671,10 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const O offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } void HelloVulkan::createBottomLevelAS() diff --git a/ray_tracing_animation/hello_vulkan.h b/ray_tracing_animation/hello_vulkan.h index d384493..e82fab2 100644 --- a/ray_tracing_animation/hello_vulkan.h +++ b/ray_tracing_animation/hello_vulkan.h @@ -57,7 +57,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing_animation/main.cpp b/ray_tracing_animation/main.cpp index 4e353a6..ca85955 100644 --- a/ray_tracing_animation/main.cpp +++ b/ray_tracing_animation/main.cpp @@ -114,6 +114,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), @@ -228,8 +230,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); // Show UI window. if(helloVk.showGui()) @@ -255,9 +255,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -277,13 +280,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -296,17 +299,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing_anyhit/hello_vulkan.cpp b/ray_tracing_anyhit/hello_vulkan.cpp index 300e755..5ab5852 100644 --- a/ray_tracing_anyhit/hello_vulkan.cpp +++ b/ray_tracing_anyhit/hello_vulkan.cpp @@ -73,7 +73,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -85,9 +85,14 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -275,8 +280,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -460,6 +465,7 @@ void HelloVulkan::onResize(int /*w*/, int /*h*/) createOffscreenRender(); updatePostDescriptorSet(); updateRtDescriptorSet(); + resetFrame(); } ////////////////////////////////////////////////////////////////////////// @@ -662,10 +668,10 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const O offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } void HelloVulkan::createBottomLevelAS() diff --git a/ray_tracing_anyhit/hello_vulkan.h b/ray_tracing_anyhit/hello_vulkan.h index 9d6279f..ac7d79b 100644 --- a/ray_tracing_anyhit/hello_vulkan.h +++ b/ray_tracing_anyhit/hello_vulkan.h @@ -57,7 +57,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing_anyhit/main.cpp b/ray_tracing_anyhit/main.cpp index 55a6fa7..4770f34 100644 --- a/ray_tracing_anyhit/main.cpp +++ b/ray_tracing_anyhit/main.cpp @@ -113,6 +113,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), @@ -222,9 +224,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -244,9 +243,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -266,13 +268,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -285,17 +287,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing_callable/hello_vulkan.cpp b/ray_tracing_callable/hello_vulkan.cpp index aa65458..b287882 100644 --- a/ray_tracing_callable/hello_vulkan.cpp +++ b/ray_tracing_callable/hello_vulkan.cpp @@ -73,7 +73,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -85,9 +85,15 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -272,8 +278,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -636,8 +642,6 @@ void HelloVulkan::initRayTracing() // nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - nvvk::RaytracingBuilderKHR::BlasInput blas; - vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); @@ -663,9 +667,10 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const O offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } void HelloVulkan::createBottomLevelAS() diff --git a/ray_tracing_callable/hello_vulkan.h b/ray_tracing_callable/hello_vulkan.h index 85f25ed..bc115b1 100644 --- a/ray_tracing_callable/hello_vulkan.h +++ b/ray_tracing_callable/hello_vulkan.h @@ -58,7 +58,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing_callable/main.cpp b/ray_tracing_callable/main.cpp index 58a332f..8b66603 100644 --- a/ray_tracing_callable/main.cpp +++ b/ray_tracing_callable/main.cpp @@ -130,6 +130,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), @@ -235,9 +237,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -257,9 +256,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -279,13 +281,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -298,17 +300,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing_gltf/hello_vulkan.cpp b/ray_tracing_gltf/hello_vulkan.cpp index d0a8dbd..152dcf0 100644 --- a/ray_tracing_gltf/hello_vulkan.cpp +++ b/ray_tracing_gltf/hello_vulkan.cpp @@ -76,7 +76,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -88,9 +88,15 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -278,8 +284,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -428,6 +434,7 @@ void HelloVulkan::onResize(int /*w*/, int /*h*/) createOffscreenRender(); updatePostDescriptorSet(); updateRtDescriptorSet(); + resetFrame(); } ////////////////////////////////////////////////////////////////////////// @@ -633,10 +640,10 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::primitiveToGeometry( offset.setPrimitiveOffset(prim.firstIndex * sizeof(uint32_t)); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } //-------------------------------------------------------------------------------------------------- diff --git a/ray_tracing_gltf/hello_vulkan.h b/ray_tracing_gltf/hello_vulkan.h index 190f107..7f600f8 100644 --- a/ray_tracing_gltf/hello_vulkan.h +++ b/ray_tracing_gltf/hello_vulkan.h @@ -57,7 +57,7 @@ public: void updateDescriptorSet(); void createUniformBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, tinygltf::Model& gltfModel); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing_gltf/main.cpp b/ray_tracing_gltf/main.cpp index bd6eb4f..0cf23b7 100644 --- a/ray_tracing_gltf/main.cpp +++ b/ray_tracing_gltf/main.cpp @@ -113,6 +113,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + std::string(PROJECT_NAME), }; @@ -215,9 +217,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -237,9 +236,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -259,13 +261,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -278,17 +280,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing_instances/hello_vulkan.cpp b/ray_tracing_instances/hello_vulkan.cpp index de3247f..4aa4e35 100644 --- a/ray_tracing_instances/hello_vulkan.cpp +++ b/ray_tracing_instances/hello_vulkan.cpp @@ -89,7 +89,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -101,9 +101,15 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_alloc.map(m_cameraMat); - memcpy(data, &ubo, sizeof(ubo)); - m_alloc.unmap(m_cameraMat); + + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -288,8 +294,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -681,10 +687,10 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const O offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } void HelloVulkan::createBottomLevelAS() diff --git a/ray_tracing_instances/hello_vulkan.h b/ray_tracing_instances/hello_vulkan.h index 0eac12e..fadf877 100644 --- a/ray_tracing_instances/hello_vulkan.h +++ b/ray_tracing_instances/hello_vulkan.h @@ -61,7 +61,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing_instances/main.cpp b/ray_tracing_instances/main.cpp index baa43c3..d3a47cf 100644 --- a/ray_tracing_instances/main.cpp +++ b/ray_tracing_instances/main.cpp @@ -114,6 +114,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), @@ -234,9 +236,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -256,9 +255,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -278,13 +280,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -297,17 +299,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing_intersection/hello_vulkan.cpp b/ray_tracing_intersection/hello_vulkan.cpp index 998b71d..c0120cd 100644 --- a/ray_tracing_intersection/hello_vulkan.cpp +++ b/ray_tracing_intersection/hello_vulkan.cpp @@ -74,7 +74,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -86,9 +86,15 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -282,8 +288,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -675,10 +681,10 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const O offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } //-------------------------------------------------------------------------------------------------- @@ -706,10 +712,10 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::sphereToVkGeometryKHR() offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } //-------------------------------------------------------------------------------------------------- diff --git a/ray_tracing_intersection/hello_vulkan.h b/ray_tracing_intersection/hello_vulkan.h index 7e0f7f5..b8e5194 100644 --- a/ray_tracing_intersection/hello_vulkan.h +++ b/ray_tracing_intersection/hello_vulkan.h @@ -57,7 +57,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing_intersection/main.cpp b/ray_tracing_intersection/main.cpp index 1c63c05..143d698 100644 --- a/ray_tracing_intersection/main.cpp +++ b/ray_tracing_intersection/main.cpp @@ -114,6 +114,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + std::string(PROJECT_NAME), }; @@ -218,9 +220,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -240,9 +239,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -262,13 +264,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -281,17 +283,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing_jitter_cam/hello_vulkan.cpp b/ray_tracing_jitter_cam/hello_vulkan.cpp index 29fafd2..bc9502a 100644 --- a/ray_tracing_jitter_cam/hello_vulkan.cpp +++ b/ray_tracing_jitter_cam/hello_vulkan.cpp @@ -73,7 +73,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -85,9 +85,15 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -272,8 +278,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -457,6 +463,7 @@ void HelloVulkan::onResize(int /*w*/, int /*h*/) createOffscreenRender(); updatePostDescriptorSet(); updateRtDescriptorSet(); + resetFrame(); } ////////////////////////////////////////////////////////////////////////// @@ -659,10 +666,10 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const O offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } void HelloVulkan::createBottomLevelAS() diff --git a/ray_tracing_jitter_cam/hello_vulkan.h b/ray_tracing_jitter_cam/hello_vulkan.h index 4d3fb0c..d526577 100644 --- a/ray_tracing_jitter_cam/hello_vulkan.h +++ b/ray_tracing_jitter_cam/hello_vulkan.h @@ -57,7 +57,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing_jitter_cam/main.cpp b/ray_tracing_jitter_cam/main.cpp index 257aa06..27797f5 100644 --- a/ray_tracing_jitter_cam/main.cpp +++ b/ray_tracing_jitter_cam/main.cpp @@ -121,6 +121,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), @@ -226,9 +228,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -253,9 +252,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -275,13 +277,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -294,17 +296,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing_manyhits/hello_vulkan.cpp b/ray_tracing_manyhits/hello_vulkan.cpp index 14af8e8..fad9433 100644 --- a/ray_tracing_manyhits/hello_vulkan.cpp +++ b/ray_tracing_manyhits/hello_vulkan.cpp @@ -72,7 +72,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -84,9 +84,15 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -271,8 +277,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -658,10 +664,10 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const O offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } void HelloVulkan::createBottomLevelAS() diff --git a/ray_tracing_manyhits/hello_vulkan.h b/ray_tracing_manyhits/hello_vulkan.h index c8f8fb0..a8eb812 100644 --- a/ray_tracing_manyhits/hello_vulkan.h +++ b/ray_tracing_manyhits/hello_vulkan.h @@ -57,7 +57,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing_manyhits/main.cpp b/ray_tracing_manyhits/main.cpp index bb4c02b..f28434c 100644 --- a/ray_tracing_manyhits/main.cpp +++ b/ray_tracing_manyhits/main.cpp @@ -112,6 +112,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), @@ -227,9 +229,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -249,9 +248,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -271,13 +273,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -290,17 +292,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } diff --git a/ray_tracing_rayquery/hello_vulkan.cpp b/ray_tracing_rayquery/hello_vulkan.cpp index 796df40..17a4498 100644 --- a/ray_tracing_rayquery/hello_vulkan.cpp +++ b/ray_tracing_rayquery/hello_vulkan.cpp @@ -71,7 +71,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -83,9 +83,15 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -279,8 +285,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -663,11 +669,11 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const O offset.setTransformOffset(0); // Our blas is only one geometry, but could be made of many geometries - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); - return blas; + return input; } //-------------------------------------------------------------------------------------------------- diff --git a/ray_tracing_rayquery/hello_vulkan.h b/ray_tracing_rayquery/hello_vulkan.h index 409e108..e5b53d3 100644 --- a/ray_tracing_rayquery/hello_vulkan.h +++ b/ray_tracing_rayquery/hello_vulkan.h @@ -57,7 +57,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing_rayquery/main.cpp b/ray_tracing_rayquery/main.cpp index 65b7b75..98b8218 100644 --- a/ray_tracing_rayquery/main.cpp +++ b/ray_tracing_rayquery/main.cpp @@ -115,6 +115,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + std::string(PROJECT_NAME), }; @@ -215,9 +217,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -236,9 +235,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -257,9 +259,9 @@ int main(int argc, char** argv) // Rendering Scene { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -272,17 +274,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); } catch(const std::system_error& e) diff --git a/ray_tracing_reflections/hello_vulkan.cpp b/ray_tracing_reflections/hello_vulkan.cpp index b661a21..00c888c 100644 --- a/ray_tracing_reflections/hello_vulkan.cpp +++ b/ray_tracing_reflections/hello_vulkan.cpp @@ -73,7 +73,7 @@ void HelloVulkan::setup(const vk::Instance& instance, //-------------------------------------------------------------------------------------------------- // Called at each frame to update the camera matrix // -void HelloVulkan::updateUniformBuffer() +void HelloVulkan::updateUniformBuffer(const vk::CommandBuffer& cmdBuf) { const float aspectRatio = m_size.width / static_cast(m_size.height); @@ -85,9 +85,15 @@ void HelloVulkan::updateUniformBuffer() // #VKRay ubo.projInverse = nvmath::invert(ubo.proj); - void* data = m_device.mapMemory(m_cameraMat.allocation, 0, sizeof(ubo)); - memcpy(data, &ubo, sizeof(ubo)); - m_device.unmapMemory(m_cameraMat.allocation); + + cmdBuf.updateBuffer(m_cameraMat.buffer, 0, ubo); + + // Making sure the matrix buffer will be available + vk::MemoryBarrier mb{vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eShaderRead}; + cmdBuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eVertexShader + | vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlagBits::eDeviceGroup, {mb}, {}, {}); } //-------------------------------------------------------------------------------------------------- @@ -272,8 +278,8 @@ void HelloVulkan::createUniformBuffer() using vkBU = vk::BufferUsageFlagBits; using vkMP = vk::MemoryPropertyFlagBits; - m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), vkBU::eUniformBuffer, - vkMP::eHostVisible | vkMP::eHostCoherent); + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), + vkBU::eUniformBuffer | vkBU::eTransferDst, vkMP::eDeviceLocal); m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); } @@ -659,10 +665,10 @@ nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const O offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::BlasInput blas; - blas.asGeometry.emplace_back(asGeom); - blas.asBuildOffsetInfo.emplace_back(offset); - return blas; + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + return input; } void HelloVulkan::createBottomLevelAS() diff --git a/ray_tracing_reflections/hello_vulkan.h b/ray_tracing_reflections/hello_vulkan.h index ab7ebb8..5b3ea9c 100644 --- a/ray_tracing_reflections/hello_vulkan.h +++ b/ray_tracing_reflections/hello_vulkan.h @@ -57,7 +57,7 @@ public: void createSceneDescriptionBuffer(); void createTextureImages(const vk::CommandBuffer& cmdBuf, const std::vector& textures); - void updateUniformBuffer(); + void updateUniformBuffer(const vk::CommandBuffer& cmdBuf); void onResize(int /*w*/, int /*h*/) override; void destroyResources(); void rasterize(const vk::CommandBuffer& cmdBuff); diff --git a/ray_tracing_reflections/main.cpp b/ray_tracing_reflections/main.cpp index fd66b87..7958713 100644 --- a/ray_tracing_reflections/main.cpp +++ b/ray_tracing_reflections/main.cpp @@ -113,6 +113,8 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { + PROJECT_ABSDIRECTORY, + PROJECT_ABSDIRECTORY "..", NVPSystem::exePath(), NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), @@ -225,9 +227,6 @@ int main(int argc, char** argv) ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - // Updating camera buffer - helloVk.updateUniformBuffer(); - // Show UI window. if(helloVk.showGui()) { @@ -248,9 +247,12 @@ int main(int argc, char** argv) // Start command buffer of this frame auto curFrame = helloVk.getCurFrame(); - const vk::CommandBuffer& cmdBuff = helloVk.getCommandBuffers()[curFrame]; + const vk::CommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; - cmdBuff.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + cmdBuf.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); // Clearing screen vk::ClearValue clearValues[2]; @@ -270,13 +272,13 @@ int main(int argc, char** argv) // Rendering Scene if(useRaytracer) { - helloVk.raytrace(cmdBuff, clearColor); + helloVk.raytrace(cmdBuf, clearColor); } else { - cmdBuff.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); - helloVk.rasterize(cmdBuff); - cmdBuff.endRenderPass(); + cmdBuf.beginRenderPass(offscreenRenderPassBeginInfo, vk::SubpassContents::eInline); + helloVk.rasterize(cmdBuf); + cmdBuf.endRenderPass(); } } @@ -289,17 +291,17 @@ int main(int argc, char** argv) postRenderPassBeginInfo.setFramebuffer(helloVk.getFramebuffers()[curFrame]); postRenderPassBeginInfo.setRenderArea({{}, helloVk.getSize()}); - cmdBuff.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); + cmdBuf.beginRenderPass(postRenderPassBeginInfo, vk::SubpassContents::eInline); // Rendering tonemapper - helloVk.drawPost(cmdBuff); + helloVk.drawPost(cmdBuf); // Rendering UI ImGui::Render(); - ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); - cmdBuff.endRenderPass(); + ImGui::RenderDrawDataVK(cmdBuf, ImGui::GetDrawData()); + cmdBuf.endRenderPass(); } // Submit for display - cmdBuff.end(); + cmdBuf.end(); helloVk.submitFrame(); }