Skip to content

Commit

Permalink
NRI v1.87:
Browse files Browse the repository at this point in the history
- API: exposed AccelerationStructure in wrapper interfaces
- VK: fixed internal type of VkFence
- VK: updated VK SDK headers
- D3D12: fixed incorrect cast (major bug)
- D3D12: fixed potential "double free"
  • Loading branch information
dzhdanNV committed Oct 28, 2022
1 parent 0f3c47b commit 22d1683
Show file tree
Hide file tree
Showing 32 changed files with 238 additions and 38 deletions.
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[submodule "External/vulkan"]
path = External/vulkan
url = https://github.com/KhronosGroup/Vulkan-Headers.git
branch = sdk-1.3.216
branch = sdk-1.3.231.0
update = merge
2 changes: 2 additions & 0 deletions Include/Extensions/NRIRayTracing.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,5 +192,7 @@ namespace nri
void (NRI_CALL *CmdWriteAccelerationStructureSize)(CommandBuffer& commandBuffer, const AccelerationStructure* const* accelerationStructures, uint32_t accelerationStructureNum, QueryPool& queryPool, uint32_t queryPoolOffset);

void (NRI_CALL *CmdDispatchRays)(CommandBuffer& commandBuffer, const DispatchRaysDesc& dispatchRaysDesc);

uint64_t (NRI_CALL* GetAccelerationStructureNativeObject)(const AccelerationStructure& accelerationStructure, uint32_t physicalDeviceIndex); // ID3D12Resource* or VkAccelerationStructureKHR
};
}
10 changes: 10 additions & 0 deletions Include/Extensions/NRIWrapperD3D12.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ struct IDXGIAdapter;

namespace nri
{
struct AccelerationStructure;

struct DeviceCreationD3D12Desc
{
ID3D12Device* d3d12Device;
Expand Down Expand Up @@ -57,6 +59,13 @@ namespace nri
ID3D12Heap* d3d12Heap;
};

struct AccelerationStructureD3D12Desc
{
ID3D12Resource* d3d12Resource;
uint64_t scratchDataSizeInBytes;
uint64_t updateScratchDataSizeInBytes;
};

NRI_API Result NRI_CALL CreateDeviceFromD3D12Device(const DeviceCreationD3D12Desc& deviceDesc, Device*& device);
NRI_API Format NRI_CALL ConvertDXGIFormatToNRI(uint32_t dxgiFormat);
NRI_API uint32_t NRI_CALL ConvertNRIFormatToDXGI(Format format);
Expand All @@ -67,6 +76,7 @@ namespace nri
Result (NRI_CALL *CreateBufferD3D12)(Device& device, const BufferD3D12Desc& bufferDesc, Buffer*& buffer);
Result (NRI_CALL *CreateTextureD3D12)(Device& device, const TextureD3D12Desc& textureDesc, Texture*& texture);
Result (NRI_CALL *CreateMemoryD3D12)(Device& device, const MemoryD3D12Desc& memoryDesc, Memory*& memory);
Result (NRI_CALL *CreateAccelerationStructureD3D12)(Device& device, const AccelerationStructureD3D12Desc& accelerationStructureDesc, AccelerationStructure*& accelerationStructure);
};

}
12 changes: 12 additions & 0 deletions Include/Extensions/NRIWrapperVK.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ struct VkImageSubresourceRange;

namespace nri
{
struct AccelerationStructure;

typedef uint64_t NRIVkCommandPool;
typedef uint64_t NRIVkImage;
typedef uint64_t NRIVkBuffer;
Expand All @@ -27,6 +29,7 @@ namespace nri
typedef uint64_t NRIVkFence;
typedef uint64_t NRIVkImageView;
typedef uint64_t NRIVkBufferView;
typedef uint64_t NRIVkAccelerationStructureKHR;

typedef void* NRIVkInstance;
typedef void* NRIVkPhysicalDevice;
Expand Down Expand Up @@ -111,6 +114,14 @@ namespace nri
uint32_t physicalDeviceMask;
};

struct AccelerationStructureVulkanDesc
{
NRIVkAccelerationStructureKHR vkAccelerationStructure;
uint64_t buildScratchSize;
uint64_t updateScratchSize;
uint32_t physicalDeviceMask;
};

NRI_API Result NRI_CALL CreateDeviceFromVkDevice(const DeviceCreationVulkanDesc& deviceDesc, Device*& device);
NRI_API Format NRI_CALL ConvertVKFormatToNRI(uint32_t vkFormat);
NRI_API uint32_t NRI_CALL ConvertNRIFormatToVK(Format format);
Expand All @@ -129,6 +140,7 @@ namespace nri
Result (NRI_CALL *CreateQueryPoolVK)(Device& device, const QueryPoolVulkanDesc& queryPoolVulkanDesc, QueryPool*& queryPool);
Result (NRI_CALL *CreateQueueSemaphoreVK)(Device& device, NRIVkSemaphore vkSemaphore, QueueSemaphore*& queueSemaphore);
Result (NRI_CALL *CreateDeviceSemaphoreVK)(Device& device, NRIVkFence vkFence, DeviceSemaphore*& deviceSemaphore);
Result (NRI_CALL *CreateAccelerationStructureVK)(Device& device, const AccelerationStructureVulkanDesc& accelerationStructureDesc, AccelerationStructure*& accelerationStructure);

NRIVkPhysicalDevice (NRI_CALL *GetVkPhysicalDevice)(const Device& device);
NRIVkInstance (NRI_CALL *GetVkInstance)(const Device& device);
Expand Down
4 changes: 2 additions & 2 deletions Include/NRI.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ license agreement from NVIDIA CORPORATION is strictly prohibited.
#include <cstddef>

#define NRI_VERSION_MAJOR 1
#define NRI_VERSION_MINOR 86
#define NRI_VERSION_DATE "19 September 2022"
#define NRI_VERSION_MINOR 87
#define NRI_VERSION_DATE "5 October 2022"
#define NRI_INTERFACE( name ) #name, sizeof(name)

#if _WIN32
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# NVIDIA Render Interface v1.86 (NRI)
# NVIDIA Render Interface v1.87 (NRI)

*NRI* is a low-level abstract render interface which currently supports three backends: D3D11, D3D12 and Vulkan. *NRI* has been designed to support all (at least major) low level features of D3D12 and Vulkan APIs, but at the same time to simplify usage and reduce the amount of code needed (especially compared with Vulkan).

Expand All @@ -10,6 +10,7 @@
- default D3D11 behavior is changed to match D3D12/VK where applicable using *NVAPI* or *AMD AGS* libraries

*NRI* is used in:
- [*NRI samples*](https://github.com/NVIDIAGameWorks/NRISamples)
- [*NRD Sample*](https://github.com/NVIDIAGameWorks/NRDSample)

## Build instructions
Expand Down
2 changes: 1 addition & 1 deletion Resources/Version.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Versioning rules:
*/

#define VERSION_MAJOR 1
#define VERSION_MINOR 86
#define VERSION_MINOR 87
#define VERSION_BUILD 0
#define VERSION_REVISION 0

Expand Down
9 changes: 9 additions & 0 deletions Source/D3D12/AccelerationStructureD3D12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,15 @@ AccelerationStructureD3D12::~AccelerationStructureD3D12()
Deallocate(m_Device.GetStdAllocator(), m_Buffer);
}

Result AccelerationStructureD3D12::Create(const AccelerationStructureD3D12Desc& accelerationStructureDesc)
{
m_PrebuildInfo.ScratchDataSizeInBytes = accelerationStructureDesc.scratchDataSizeInBytes;
m_PrebuildInfo.UpdateScratchDataSizeInBytes = accelerationStructureDesc.updateScratchDataSizeInBytes;
BufferD3D12Desc bufferDesc = {};
bufferDesc.d3d12Resource = (ID3D12Resource*)accelerationStructureDesc.d3d12Resource;
return m_Device.CreateBuffer(bufferDesc, (Buffer*&)m_Buffer);
}

Result AccelerationStructureD3D12::Create(const AccelerationStructureDesc& accelerationStructureDesc)
{
D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS accelerationStructureInputs = {};
Expand Down
13 changes: 13 additions & 0 deletions Source/D3D12/AccelerationStructureD3D12.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@ namespace nri
~AccelerationStructureD3D12();

DeviceD3D12& GetDevice() const;
operator ID3D12Resource*() const;
operator BufferD3D12* () const;

Result Create(const AccelerationStructureDesc& accelerationStructureDesc);
Result Create(const AccelerationStructureD3D12Desc& accelerationStructureDesc);
void GetMemoryInfo(MemoryDesc& memoryDesc) const;
uint64_t GetUpdateScratchBufferSize() const;
uint64_t GetBuildScratchBufferSize() const;
Expand All @@ -50,5 +53,15 @@ namespace nri
{
return m_Device;
}

inline AccelerationStructureD3D12::operator ID3D12Resource*() const
{
return (ID3D12Resource*)m_Buffer;
}

inline AccelerationStructureD3D12::operator BufferD3D12* () const
{
return m_Buffer;
}
}
#endif
8 changes: 8 additions & 0 deletions Source/D3D12/AccelerationStructureD3D12.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,13 @@ static void NRI_CALL SetAccelerationStructureDebugName(AccelerationStructure& ac
((AccelerationStructureD3D12&)accelerationStructure).SetDebugName(name);
}

static uint64_t NRI_CALL GetAccelerationStructureNativeObject(const AccelerationStructure& accelerationStructure, uint32_t physicalDeviceIndex)
{
MaybeUnused(physicalDeviceIndex); // TODO: use it

return uint64_t((ID3D12Resource*)((AccelerationStructureD3D12&)accelerationStructure));
}

void FillFunctionTableAccelerationStructureD3D12(RayTracingInterface& rayTracingInterface)
{
rayTracingInterface.CreateAccelerationStructureDescriptor = ::CreateAccelerationStructureDescriptor;
Expand All @@ -52,6 +59,7 @@ void FillFunctionTableAccelerationStructureD3D12(RayTracingInterface& rayTracing
rayTracingInterface.GetAccelerationStructureBuildScratchBufferSize = ::GetAccelerationStructureBuildScratchBufferSize;
rayTracingInterface.GetAccelerationStructureHandle = ::GetAccelerationStructureHandle;
rayTracingInterface.SetAccelerationStructureDebugName = ::SetAccelerationStructureDebugName;
rayTracingInterface.GetAccelerationStructureNativeObject = ::GetAccelerationStructureNativeObject;
}

#pragma endregion
4 changes: 2 additions & 2 deletions Source/D3D12/CommandBufferD3D12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -517,8 +517,8 @@ inline void CommandBufferD3D12::PipelineBarrier(const TransitionBarrierDesc* tra
{
D3D12_RESOURCE_BARRIER& barrier = *ptr++;
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_ALIASING;
barrier.Aliasing.pResourceBefore = *((BufferD3D12*)aliasingBarriers->textures[i].before);
barrier.Aliasing.pResourceAfter = *((BufferD3D12*)aliasingBarriers->textures[i].after);
barrier.Aliasing.pResourceBefore = *((TextureD3D12*)aliasingBarriers->textures[i].before);
barrier.Aliasing.pResourceAfter = *((TextureD3D12*)aliasingBarriers->textures[i].after);
}
}

Expand Down
5 changes: 3 additions & 2 deletions Source/D3D12/DescriptorPoolD3D12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ DescriptorPoolD3D12::DescriptorPoolD3D12(DeviceD3D12& device)

DescriptorPoolD3D12::~DescriptorPoolD3D12()
{
for (size_t i = 0; i < m_DescriptorSetNum; i++)
Deallocate(m_Device.GetStdAllocator(), m_DescriptorSets[i]);
Reset();

m_DescriptorSets.clear();
}

Result DescriptorPoolD3D12::Create(const DescriptorPoolDesc& descriptorPoolDesc)
Expand Down
2 changes: 1 addition & 1 deletion Source/D3D12/DescriptorPoolD3D12.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ namespace nri
std::array<DescriptorHeapDesc, DescriptorHeapType::MAX_NUM> m_DescriptorHeapDescs;
std::array<uint32_t, DescriptorHeapType::MAX_NUM> m_DescriptorNum = {};
std::array<ID3D12DescriptorHeap*, DescriptorHeapType::MAX_NUM> m_DescriptorHeaps = {};
uint32_t m_DescriptorHeapNum = 0;
Vector<DescriptorSetD3D12*> m_DescriptorSets;
uint32_t m_DescriptorHeapNum = 0;
uint32_t m_DescriptorSetNum = 0;
};

Expand Down
5 changes: 5 additions & 0 deletions Source/D3D12/DeviceD3D12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,11 @@ Result DeviceD3D12::CreateAccelerationStructure(const AccelerationStructureDesc&
return CreateImplementation<AccelerationStructureD3D12>(accelerationStructure, accelerationStructureDesc);
}

Result DeviceD3D12::CreateAccelerationStructure(const AccelerationStructureD3D12Desc& accelerationStructureDesc, AccelerationStructure*& accelerationStructure)
{
return CreateImplementation<AccelerationStructureD3D12>(accelerationStructure, accelerationStructureDesc);
}

inline void DeviceD3D12::DestroyAccelerationStructure(AccelerationStructure& accelerationStructure)
{
Deallocate(GetStdAllocator(), (AccelerationStructureD3D12*)&accelerationStructure);
Expand Down
7 changes: 4 additions & 3 deletions Source/D3D12/DeviceD3D12.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/*
/*
Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
NVIDIA CORPORATION and its licensors retain all intellectual property
Expand Down Expand Up @@ -107,9 +107,10 @@ namespace nri
Result CreateDeviceSemaphore(bool signaled, DeviceSemaphore*& deviceSemaphore);

Result CreateCommandBuffer(const CommandBufferD3D12Desc& commandBufferDesc, CommandBuffer*& commandBuffer);
Result CreateBuffer(const BufferD3D12Desc& commandBufferDesc, Buffer*& commandBuffer);
Result CreateTexture(const TextureD3D12Desc& commandBufferDesc, Texture*& commandBuffer);
Result CreateBuffer(const BufferD3D12Desc& bufferDesc, Buffer*& buffer);
Result CreateTexture(const TextureD3D12Desc& textureDesc, Texture*& texture);
Result CreateMemory(const MemoryD3D12Desc& memoryDesc, Memory*& memory);
Result CreateAccelerationStructure(const AccelerationStructureD3D12Desc& accelerationStructureDesc, AccelerationStructure*& accelerationStructure);

void DestroyCommandAllocator(CommandAllocator& commandAllocator);
void DestroyDescriptorPool(DescriptorPool& descriptorPool);
Expand Down
6 changes: 6 additions & 0 deletions Source/D3D12/DeviceD3D12.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -389,13 +389,19 @@ static Result NRI_CALL CreateMemoryD3D12(Device& device, const MemoryD3D12Desc&
return ((DeviceD3D12&)device).CreateMemory(memoryDesc, memory);
}

static Result NRI_CALL CreateAccelerationStructureD3D12(Device& device, const AccelerationStructureD3D12Desc& accelerationStructureDesc, AccelerationStructure*& memory)
{
return ((DeviceD3D12&)device).CreateAccelerationStructure(accelerationStructureDesc, memory);
}

Result DeviceD3D12::FillFunctionTable(WrapperD3D12Interface& wrapperD3D12Interface) const
{
wrapperD3D12Interface = {};
wrapperD3D12Interface.CreateCommandBufferD3D12 = ::CreateCommandBufferD3D12;
wrapperD3D12Interface.CreateBufferD3D12 = ::CreateBufferD3D12;
wrapperD3D12Interface.CreateTextureD3D12 = ::CreateTextureD3D12;
wrapperD3D12Interface.CreateMemoryD3D12 = ::CreateMemoryD3D12;
wrapperD3D12Interface.CreateAccelerationStructureD3D12 = ::CreateAccelerationStructureD3D12;

return ValidateFunctionTable(GetLog(), wrapperD3D12Interface);
}
Expand Down
38 changes: 38 additions & 0 deletions Source/VK/AccelerationStructureVK.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ AccelerationStructureVK::~AccelerationStructureVK()
{
const auto& vk = m_Device.GetDispatchTable();

if (!m_OwnsNativeObjects)
return;

for (uint32_t i = 0; i < GetCountOf(m_Handles); i++)
{
if (m_Handles[i] != VK_NULL_HANDLE)
Expand All @@ -34,6 +37,7 @@ AccelerationStructureVK::~AccelerationStructureVK()

Result AccelerationStructureVK::Create(const AccelerationStructureDesc& accelerationStructureDesc)
{
m_OwnsNativeObjects = true;
m_Type = GetAccelerationStructureType(accelerationStructureDesc.type);
m_BuildFlags = GetAccelerationStructureBuildFlags(accelerationStructureDesc.flags);

Expand All @@ -58,6 +62,40 @@ Result AccelerationStructureVK::Create(const AccelerationStructureDesc& accelera
return result;
}

Result AccelerationStructureVK::Create(const AccelerationStructureVulkanDesc& accelerationStructureDesc)
{
m_OwnsNativeObjects = false;
m_Type = VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_KHR;
m_BuildFlags = 0;

uint32_t physicalDeviceMask = GetPhysicalDeviceGroupMask(accelerationStructureDesc.physicalDeviceMask);

VkAccelerationStructureDeviceAddressInfoKHR deviceAddressInfo = {};
deviceAddressInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR;
deviceAddressInfo.accelerationStructure = (VkAccelerationStructureKHR)accelerationStructureDesc.vkAccelerationStructure;

const auto& vk = m_Device.GetDispatchTable();

const uint64_t deviceAddress = vk.GetAccelerationStructureDeviceAddressKHR(m_Device, &deviceAddressInfo);

if (deviceAddress == 0)
return Result::FAILURE;

for (uint32_t i = 0; i < m_Device.GetPhyiscalDeviceGroupSize(); i++)
{
if ((1 << i) & physicalDeviceMask)
{
m_Handles[i] = (VkAccelerationStructureKHR)accelerationStructureDesc.vkAccelerationStructure;
m_DeviceAddresses[i] = deviceAddress;
}
}

m_BuildScratchSize = accelerationStructureDesc.buildScratchSize;
m_UpdateScratchSize = accelerationStructureDesc.updateScratchSize;

return Result::SUCCESS;
}

void AccelerationStructureVK::PrecreateBottomLevel(const AccelerationStructureDesc& accelerationStructureDesc)
{
const auto buildType = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR;
Expand Down
2 changes: 2 additions & 0 deletions Source/VK/AccelerationStructureVK.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ namespace nri

DeviceVK& GetDevice() const;
Result Create(const AccelerationStructureDesc& accelerationStructureDesc);
Result Create(const AccelerationStructureVulkanDesc& accelerationStructureDesc);
Result FinishCreation();
VkAccelerationStructureKHR GetHandle(uint32_t physicalDeviceIndex) const;
BufferVK* GetBuffer() const;
Expand All @@ -46,6 +47,7 @@ namespace nri
uint32_t m_PhysicalDeviceMask = 0;
VkAccelerationStructureTypeKHR m_Type = (VkAccelerationStructureTypeKHR)0;
VkBuildAccelerationStructureFlagsKHR m_BuildFlags = (VkBuildAccelerationStructureFlagsKHR)0;
bool m_OwnsNativeObjects = false;
};

inline AccelerationStructureVK::AccelerationStructureVK(DeviceVK& device) :
Expand Down
6 changes: 6 additions & 0 deletions Source/VK/AcceleratrionStructureVK.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ static Result NRI_CALL CreateAccelerationStructureDescriptor(const AccelerationS
return ((AccelerationStructureVK&)accelerationStructure).CreateDescriptor(physicalDeviceIndex, descriptor);
}

static uint64_t NRI_CALL GetAccelerationStructureNativeObject(const AccelerationStructure& accelerationStructure, uint32_t physicalDeviceIndex)
{
return uint64_t(((AccelerationStructureVK&)accelerationStructure).GetHandle(physicalDeviceIndex));
}

void FillFunctionTableAccelerationStructureVK(RayTracingInterface& rayTracingInterface)
{
rayTracingInterface.GetAccelerationStructureMemoryInfo = ::GetAccelerationStructureMemoryInfo;
Expand All @@ -51,6 +56,7 @@ void FillFunctionTableAccelerationStructureVK(RayTracingInterface& rayTracingInt
rayTracingInterface.GetAccelerationStructureHandle = ::GetAccelerationStructureHandle;
rayTracingInterface.SetAccelerationStructureDebugName = ::SetAccelerationStructureDebugName;
rayTracingInterface.CreateAccelerationStructureDescriptor = ::CreateAccelerationStructureDescriptor;
rayTracingInterface.GetAccelerationStructureNativeObject = ::GetAccelerationStructureNativeObject;
}

#pragma endregion
2 changes: 1 addition & 1 deletion Source/VK/DeviceSemaphoreVK.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ Result DeviceSemaphoreVK::Create(bool signaled)
return Result::SUCCESS;
}

Result DeviceSemaphoreVK::Create(void* vkFence)
Result DeviceSemaphoreVK::Create(NRIVkFence vkFence)
{
m_OwnsNativeObjects = false;
m_Handle = (VkFence)vkFence;
Expand Down
2 changes: 1 addition & 1 deletion Source/VK/DeviceSemaphoreVK.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace nri
operator VkFence() const;
DeviceVK& GetDevice() const;
Result Create(bool signaled);
Result Create(void* vkFence);
Result Create(NRIVkFence vkFence);

void SetDebugName(const char* name);

Expand Down
Loading

0 comments on commit 22d1683

Please sign in to comment.