diff --git a/modules/rtx/include/vkcv/rtx/ASManager.hpp b/modules/rtx/include/vkcv/rtx/ASManager.hpp index 99d2fc5eaba27c5777105de3e82f579a7c4770e2..49dcb92433be38ac6d8a0196012ef39ca81a2171 100644 --- a/modules/rtx/include/vkcv/rtx/ASManager.hpp +++ b/modules/rtx/include/vkcv/rtx/ASManager.hpp @@ -6,7 +6,6 @@ namespace vkcv::rtx { class ASManager { private: - vkcv::BufferHandle m_buffer; Core* m_core; public: @@ -21,6 +20,6 @@ namespace vkcv::rtx { * @param[in] vertexBuffer The vertex buffer. * @param[in] indexBuffer The index buffer. */ - void buildBLAS(Buffer<uint8_t> &vertexBuffer, Buffer<uint8_t> &indexBuffer); + void buildBLAS(Buffer<uint16_t> &vertexBuffer, Buffer<uint16_t> &indexBuffer); }; } \ No newline at end of file diff --git a/modules/rtx/include/vkcv/rtx/RTX.hpp b/modules/rtx/include/vkcv/rtx/RTX.hpp index d33217b82c282d7a9b247b1e94d0bd684acd43d2..13469b5bdc0c482aaf5af0c2079a8b80b0ffc460 100644 --- a/modules/rtx/include/vkcv/rtx/RTX.hpp +++ b/modules/rtx/include/vkcv/rtx/RTX.hpp @@ -42,7 +42,7 @@ namespace vkcv::rtx { * @param vertexBuffer * @param indexBuffer */ - void init(Core* core, Buffer<uint8_t> &vertexBuffer, Buffer<uint8_t> &indexBuffer); + void init(Core* core, Buffer<uint16_t> &vertexBuffer, Buffer<uint16_t> &indexBuffer); }; } diff --git a/modules/rtx/src/vkcv/rtx/ASManager.cpp b/modules/rtx/src/vkcv/rtx/ASManager.cpp index 048bac145aae5ec0b6358efe8268013511753732..d732c1dadc071b69a58a8211103e052751b64a49 100644 --- a/modules/rtx/src/vkcv/rtx/ASManager.cpp +++ b/modules/rtx/src/vkcv/rtx/ASManager.cpp @@ -11,17 +11,17 @@ namespace vkcv::rtx { } - void ASManager::buildBLAS(Buffer<uint8_t> &vertexBuffer, Buffer<uint8_t> &indexBuffer) { - // INFO: Es scheint, dass wir einen DispatchLoaderDynamic brauchen, damit Funktionen wie .getBufferAddressKHR keine Linker Error schmeissen. - // Die Frage ist, wieso? und wie koennen wir das problem evtl. anders behandeln? Mit dem DispatchLoaderDynamic gehen zwar die Fehler weg, - // aber die Anwendung crasht... + void ASManager::buildBLAS(Buffer<uint16_t> &vertexBuffer, Buffer<uint16_t> &indexBuffer) { + // INFO: It seems that we need a dynamic dispatch loader because Vulkan is an ASs ... + vk::DispatchLoaderDynamic dld( (PFN_vkGetInstanceProcAddr) m_core->getContext().getInstance().getProcAddr("vkGetInstanceProcAddr") ); + dld.init(m_core->getContext().getInstance()); vk::BufferDeviceAddressInfo vertexBufferDeviceAddressInfo(vertexBuffer.getVulkanHandle()); - vk::DeviceAddress vertexBufferAddress = m_core->getContext().getDevice().getBufferAddressKHR(vertexBufferDeviceAddressInfo); + vk::DeviceAddress vertexBufferAddress = m_core->getContext().getDevice().getBufferAddressKHR(vertexBufferDeviceAddressInfo, dld); vk::DeviceOrHostAddressConstKHR vertexDeviceOrHostAddressConst(vertexBufferAddress); vk::BufferDeviceAddressInfo indexBufferDeviceAddressInfo(indexBuffer.getVulkanHandle()); - vk::DeviceAddress indexBufferAddress = m_core->getContext().getDevice().getBufferAddressKHR(indexBufferDeviceAddressInfo); + vk::DeviceAddress indexBufferAddress = m_core->getContext().getDevice().getBufferAddressKHR(indexBufferDeviceAddressInfo, dld); vk::DeviceOrHostAddressConstKHR indexDeviceOrHostAddressConst(indexBufferAddress); // Specify triangle mesh data // TODO: Check if valid entries ... @@ -30,7 +30,7 @@ namespace vkcv::rtx { vertexDeviceOrHostAddressConst, // vertex buffer address (vk::DeviceOrHostAddressConstKHR) 3 * sizeof(float), // vertex stride (vk::DeviceSize) uint32_t(vertexBuffer.getCount() - 1), // maxVertex (uint32_t) - vk::IndexType::eUint8EXT, // indexType (vk::IndexType) + vk::IndexType::eUint16, // indexType (vk::IndexType) --> INFO: UINT16 oder UINT32! indexDeviceOrHostAddressConst, // indexData (vk::DeviceOrHostAddressConstKHR) {} // transformData (vk::DeviceOrHostAddressConstKHR) ); @@ -65,11 +65,12 @@ namespace vkcv::rtx { vk::AccelerationStructureBuildTypeKHR::eDevice, // build on device instead of host &asBuildInfo, // pointer to build info &asRangeInfo.primitiveCount, // array of number of primitives per geometry - &asBuildSizesInfo // output pointer to store sizes + &asBuildSizesInfo, // output pointer to store sizes + dld ); // Allocate the AS TODO: which type do we need for the buffer?? - Buffer<vk::AccelerationStructureKHR> asBuffer = m_core->createBuffer<vk::AccelerationStructureKHR>(BufferType::RT_ACCELERATION, asBuildSizesInfo.accelerationStructureSize, BufferMemoryType::DEVICE_LOCAL); + Buffer<vk::AccelerationStructureKHR> asBuffer = m_core->createBuffer<vk::AccelerationStructureKHR>(BufferType::RT_ACCELERATION_VERTEX, asBuildSizesInfo.accelerationStructureSize, BufferMemoryType::DEVICE_LOCAL); // core->createBuffer<>() // Create an empty AS object @@ -86,12 +87,15 @@ namespace vkcv::rtx { vk::Result res = m_core->getContext().getDevice().createAccelerationStructureKHR( &asCreateInfo, // AS create info nullptr, // allocator callbacks - &blas // the AS + &blas, // the AS + dld ); if(res != vk::Result::eSuccess) { vkcv_log(vkcv::LogLevel::ERROR, "The Bottom Level Acceleration Structure could not be builded!"); } asBuildInfo.setDstAccelerationStructure(blas); + + // TODO: destroy accelerationstructure when closing app } } \ No newline at end of file diff --git a/modules/rtx/src/vkcv/rtx/RTX.cpp b/modules/rtx/src/vkcv/rtx/RTX.cpp index ba79add844efab3adf028ebaf7d8b49a0dae12d2..b4e07e7132f9851407933f851aafab33cd323d75 100644 --- a/modules/rtx/src/vkcv/rtx/RTX.cpp +++ b/modules/rtx/src/vkcv/rtx/RTX.cpp @@ -22,7 +22,7 @@ namespace vkcv::rtx { }; } - void RTXModule::init(Core* core, Buffer<uint8_t> &vertexBuffer, Buffer<uint8_t> &indexBuffer) { + void RTXModule::init(Core* core, Buffer<uint16_t> &vertexBuffer, Buffer<uint16_t> &indexBuffer) { // build acceleration structures BLAS then TLAS --> see ASManager ASManager asManager(core); diff --git a/projects/rtx/src/main.cpp b/projects/rtx/src/main.cpp index 350db2343f5bd557bd320e16baf2daaa6e886847..b9bb30acb84bcd790a684bb3e12d628c93eb8b9d 100644 --- a/projects/rtx/src/main.cpp +++ b/projects/rtx/src/main.cpp @@ -71,24 +71,34 @@ int main(int argc, const char** argv) { } assert(!mesh.vertexGroups.empty()); - auto vertexBuffer = core.createBuffer<uint8_t>( - vkcv::BufferType::VERTEX, + auto vertexBuffer = core.createBuffer<uint16_t>( + vkcv::BufferType::RT_ACCELERATION_VERTEX, mesh.vertexGroups[0].vertexBuffer.data.size(), vkcv::BufferMemoryType::DEVICE_LOCAL ); - vk::Buffer vertexBufferHandle = vertexBuffer.getVulkanHandle(); + std::vector<uint16_t> vertices = {}; + for (int i=0; i<mesh.vertexGroups[0].vertexBuffer.data.size(); i++) { + vertices.emplace_back((uint16_t)mesh.vertexGroups[0].vertexBuffer.data[i]); + } - vertexBuffer.fill(mesh.vertexGroups[0].vertexBuffer.data); + vertexBuffer.fill(vertices); - auto indexBuffer = core.createBuffer<uint8_t>( - vkcv::BufferType::INDEX, + auto indexBuffer = core.createBuffer<uint16_t>( + vkcv::BufferType::RT_ACCELERATION_INDEX, mesh.vertexGroups[0].indexBuffer.data.size(), vkcv::BufferMemoryType::DEVICE_LOCAL ); - indexBuffer.fill(mesh.vertexGroups[0].indexBuffer.data); + std::vector<uint16_t> indices = {}; + + for (int i=0; i<mesh.vertexGroups[0].vertexBuffer.data.size(); i++) { + indices.emplace_back((uint16_t)mesh.vertexGroups[0].indexBuffer.data[i]); + } + + indexBuffer.fill(indices); + // init RTXModule rtxModule.init(&core, vertexBuffer, indexBuffer);