Skip to content

Commit

Permalink
Several changes:
Browse files Browse the repository at this point in the history
- Core: added a few functions for profiling tools (code markup for NVIDIA Nsight Systems), off by default (see Cmake option "NRI_ENABLE_NVTX_SUPPORT")
- Core: added "ResetQueries" to reset queries on the host (non NOP only on VK)
- Core: added color for "CmdBeginAnnotation" (use BGRA_UNUSED if don't care)
- D3D11: switched perf markers to PIX, but actually it's a NOP change
- Validation: removed Over9000 complex validation for queries (let's realy on the graphics debug layer)
  • Loading branch information
dzhdanNV committed Dec 20, 2024
1 parent 23b17fb commit c127288
Show file tree
Hide file tree
Showing 30 changed files with 194 additions and 225 deletions.
17 changes: 12 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ cmake_minimum_required (VERSION 3.15)

# Options
option (NRI_STATIC_LIBRARY "Build static library" OFF)
option (NRI_ENABLE_NVTX_SUPPORT "Annotations for NVIDIA Nsight Systems" OFF)

# Options: backends
option (NRI_ENABLE_NONE_SUPPORT "Enable NONE backend" ON)
Expand Down Expand Up @@ -121,7 +122,10 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set (COMPILE_OPTIONS -msse4.1 -Wextra -Wno-missing-field-initializers)
elseif (MSVC)
set (COMPILE_OPTIONS /W4 /WX /wd4324)
set (COMPILE_OPTIONS
/W4 /WX
/wd4324 # padding was added at the end of a structure because you specified an alignment specifier
)
else ()
message (WARNING "Unknown compiler!")
endif ()
Expand All @@ -130,6 +134,9 @@ set (COMPILE_DEFINITIONS WIN32_LEAN_AND_MEAN NOMINMAX _CRT_SECURE_NO_WARNINGS)
if (NRI_ENABLE_EXTERNAL_LIBRARIES)
set (COMPILE_DEFINITIONS ${COMPILE_DEFINITIONS} NRI_USE_EXT_LIBS=1)
endif ()
if (NRI_ENABLE_NVTX_SUPPORT)
set (COMPILE_DEFINITIONS ${COMPILE_DEFINITIONS} NRI_USE_NVTX=1)
endif ()

# External libs
if (WIN32 AND NRI_ENABLE_EXTERNAL_LIBRARIES AND (NRI_ENABLE_D3D11_SUPPORT OR NRI_ENABLE_D3D12_SUPPORT))
Expand All @@ -150,7 +157,7 @@ if (NRI_ENABLE_NONE_SUPPORT)
file (GLOB NONE_SOURCE "Source/NONE/*")
source_group ("" FILES ${NONE_SOURCE})
add_library (NRI_NONE STATIC ${NONE_SOURCE})
target_include_directories (NRI_NONE PRIVATE "Include" "Source/Shared")
target_include_directories (NRI_NONE PRIVATE "Include" "Source/Shared" "External")
target_compile_definitions (NRI_NONE PRIVATE ${COMPILE_DEFINITIONS})
target_compile_options (NRI_NONE PRIVATE ${COMPILE_OPTIONS})
set_property (TARGET NRI_NONE PROPERTY FOLDER ${PROJECT_FOLDER})
Expand Down Expand Up @@ -271,7 +278,7 @@ endif ()
file (GLOB SHARED_SOURCE "Source/Shared/*.cpp" "Source/Shared/*.h" "Source/Shared/*.hpp")
source_group ("" FILES ${SHARED_SOURCE})
add_library (NRI_Shared STATIC ${SHARED_SOURCE})
target_include_directories (NRI_Shared PRIVATE "Include" "Source/Shared")
target_include_directories (NRI_Shared PRIVATE "Include" "Source/Shared" "External")
target_compile_definitions (NRI_Shared PRIVATE ${COMPILE_DEFINITIONS})
target_compile_options (NRI_Shared PRIVATE ${COMPILE_OPTIONS})
set_property (TARGET NRI_Shared PROPERTY FOLDER ${PROJECT_FOLDER})
Expand All @@ -280,7 +287,7 @@ set_property (TARGET NRI_Shared PROPERTY FOLDER ${PROJECT_FOLDER})
file (GLOB NRI_VALIDATION_SOURCE "Source/Validation/*.cpp" "Source/Validation/*.h" "Source/Validation/*.hpp")
source_group ("" FILES ${NRI_VALIDATION_SOURCE})
add_library (NRI_Validation STATIC ${NRI_VALIDATION_SOURCE})
target_include_directories (NRI_Validation PRIVATE "Include" "Source/Shared")
target_include_directories (NRI_Validation PRIVATE "Include" "Source/Shared" "External")
target_compile_definitions (NRI_Validation PRIVATE ${COMPILE_DEFINITIONS})
target_compile_options (NRI_Validation PRIVATE ${COMPILE_OPTIONS})
target_link_libraries (NRI_Validation PRIVATE NRI_Shared)
Expand Down Expand Up @@ -312,7 +319,7 @@ else ()
endif ()
endif ()

target_include_directories (${PROJECT_NAME} PRIVATE "Include" "Source/Shared" "External/vulkan/include")
target_include_directories (${PROJECT_NAME} PRIVATE "Include" "Source/Shared" "External" "External/vulkan/include")
target_compile_definitions (${PROJECT_NAME} PRIVATE ${COMPILE_DEFINITIONS})
target_compile_options (${PROJECT_NAME} PRIVATE ${COMPILE_OPTIONS})

Expand Down
1 change: 1 addition & 0 deletions Include/Extensions/NRIHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,4 +200,5 @@ static inline Nri(TextureBarrierDesc) NriFunc(TextureBarrierFromState)(NriRef(Te

return *NriDeref(prevState);
}

NriNamespaceEnd
18 changes: 14 additions & 4 deletions Include/NRI.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Non-goals:

#define NRI_VERSION_MAJOR 1
#define NRI_VERSION_MINOR 155
#define NRI_VERSION_DATE "19 December 2024"
#define NRI_VERSION_DATE "20 December 2024"

#include "NRIDescs.h"

Expand All @@ -34,6 +34,13 @@ NriNamespaceBegin
// Example: Result result = nriGetInterface(device, NRI_INTERFACE(CoreInterface), &coreInterface)
NRI_API Nri(Result) NRI_CALL nriGetInterface(const NriRef(Device) device, const char* interfaceName, size_t interfaceSize, void* interfacePtr);

// Annotations for profiling tools: host (via NVTX)
// BGRA color can be constructed via "NriBgra" macro or "BGRA_UNUSED" constant
NRI_API void NRI_CALL nriBeginAnnotation(const char* name, uint32_t bgra); // start a named range
NRI_API void NRI_CALL nriEndAnnotation(); // end the last opened range
NRI_API void NRI_CALL nriEvent(const char* name, uint32_t bgra); // emit a simulateneous event
NRI_API void NRI_CALL nriSetThreadName(const char* name); // assign a name to the current thread

NriStruct(CoreInterface) {
// Get
const NriRef(DeviceDesc) (NRI_CALL *GetDeviceDesc) (const NriRef(Device) device);
Expand Down Expand Up @@ -166,14 +173,17 @@ NriStruct(CoreInterface) {
void (NRI_CALL *CmdEndQuery) (NriRef(CommandBuffer) commandBuffer, NriRef(QueryPool) queryPool, uint32_t offset);
void (NRI_CALL *CmdCopyQueries) (NriRef(CommandBuffer) commandBuffer, const NriRef(QueryPool) queryPool, uint32_t offset, uint32_t num, NriRef(Buffer) dstBuffer, uint64_t dstOffset);

// Annotation
void (NRI_CALL *CmdBeginAnnotation) (NriRef(CommandBuffer) commandBuffer, const char* name);
// Annotations for profiling tools: device
void (NRI_CALL *CmdBeginAnnotation) (NriRef(CommandBuffer) commandBuffer, const char* name, uint32_t bgra);
void (NRI_CALL *CmdEndAnnotation) (NriRef(CommandBuffer) commandBuffer);
// } }
Nri(Result) (NRI_CALL *EndCommandBuffer) (NriRef(CommandBuffer) commandBuffer);

// Query
void (NRI_CALL *ResetQueries) (NriRef(QueryPool) queryPool, uint32_t offset, uint32_t num); // on host

// Work submission and synchronization
void (NRI_CALL *QueueSubmit) (NriRef(CommandQueue) commandQueue, const NriRef(QueueSubmitDesc) queueSubmitDesc); // on device
void (NRI_CALL *QueueSubmit) (NriRef(CommandQueue) commandQueue, const NriRef(QueueSubmitDesc) queueSubmitDesc); // to device
void (NRI_CALL *Wait) (NriRef(Fence) fence, uint64_t value); // on host
uint64_t (NRI_CALL *GetFenceValue) (NriRef(Fence) fence);

Expand Down
1 change: 1 addition & 0 deletions Include/NRIDescs.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ typedef uint16_t Nri(Dim_t);
typedef uint32_t Nri(MemoryType);

// Aliases
static const uint32_t NriConstant(BGRA_UNUSED) = 0; // only for "bgra" color for profiling
static const uint32_t NriConstant(ALL_SAMPLES) = 0; // only for "sampleMask"
static const uint32_t NriConstant(ONE_VIEWPORT) = 0; // only for "viewportNum"
static const Nri(Dim_t) NriConstant(WHOLE_SIZE) = 0; // only for "Dim_t" and "size"
Expand Down
1 change: 1 addition & 0 deletions Include/NRIMacro.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#undef ERROR

#define NriBit(bit) (1 << (bit))
#define NriBgra(r, g, b) (0xFF000000 | ((r) << 16) | ((g) << 8) | (b))

#define NRI_NAME_C(name) Nri##name
#define NRI_FUNC_NAME_C(name) nri##name
Expand Down
77 changes: 76 additions & 1 deletion Source/Creation/Creation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,76 @@ NRI_API Result NRI_CALL nriGetInterface(const Device& device, const char* interf
return result;
}

NRI_API void NRI_CALL nriBeginAnnotation(const char* name, uint32_t bgra) {
MaybeUnused(name, bgra);

#if NRI_USE_NVTX
nvtxEventAttributes_t eventAttrib = {};
eventAttrib.version = NVTX_VERSION;
eventAttrib.size = NVTX_EVENT_ATTRIB_STRUCT_SIZE;
eventAttrib.colorType = bgra == BGRA_UNUSED ? NVTX_COLOR_UNKNOWN : NVTX_COLOR_ARGB;
eventAttrib.color = bgra;
eventAttrib.messageType = NVTX_MESSAGE_TYPE_ASCII;
eventAttrib.message.ascii = name;

nvtxRangePushEx(&eventAttrib);
#endif
}

NRI_API void NRI_CALL nriEndAnnotation() {
#if NRI_USE_NVTX
nvtxRangePop();
#endif
}

NRI_API void NRI_CALL nriEvent(const char* name, uint32_t bgra) {
MaybeUnused(name, bgra);

#if NRI_USE_NVTX
nvtxEventAttributes_t eventAttrib = {};
eventAttrib.version = NVTX_VERSION;
eventAttrib.size = NVTX_EVENT_ATTRIB_STRUCT_SIZE;
eventAttrib.colorType = bgra == BGRA_UNUSED ? NVTX_COLOR_UNKNOWN : NVTX_COLOR_ARGB;
eventAttrib.color = bgra;
eventAttrib.messageType = NVTX_MESSAGE_TYPE_ASCII;
eventAttrib.message.ascii = name;

nvtxMarkEx(&eventAttrib);
#endif
}

#if NRI_USE_NVTX

# if (defined __linux__)
# include <sys/syscall.h>
# elif (defined __APPLE__)
# include <sys/syscall.h>
# elif (defined __ANDROID__)
# include <unistd.h>
# elif (defined _WIN64)
# include <windows.h>
# endif

NRI_API void NRI_CALL nriSetThreadName(const char* name) {
# if (defined __linux__)
nvtxNameOsThreadA(syscall(SYS_gettid), name);
# elif (defined __APPLE__)
nvtxNameOsThreadA(syscall(SYS_thread_selfid), name);
# elif (defined __ANDROID__)
nvtxNameOsThreadA(gettid(), name);
# elif (defined _WIN64)
nvtxNameOsThreadA(GetCurrentThreadId(), name);
# endif
}

#else

NRI_API void NRI_CALL nriSetThreadName(const char* name) {
MaybeUnused(name);
}

#endif

template <typename T>
Result FinalizeDeviceCreation(const T& deviceCreationDesc, DeviceBase& deviceImpl, Device*& device) {
if (deviceCreationDesc.enableNRIValidation && deviceCreationDesc.graphicsAPI != GraphicsAPI::NONE) {
Expand All @@ -113,9 +183,14 @@ Result FinalizeDeviceCreation(const T& deviceCreationDesc, DeviceBase& deviceImp
}

device = deviceVal;
} else
} else {
device = (Device*)&deviceImpl;

#if NRI_USE_NVTX
nvtxInitialize(nullptr); // needed only to avoid stalls on the first use
#endif
}

return Result::SUCCESS;
}

Expand Down
2 changes: 1 addition & 1 deletion Source/D3D11/CommandBufferD3D11.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ struct CommandBufferD3D11 final : public CommandBufferHelper {
void BeginQuery(QueryPool& queryPool, uint32_t offset);
void EndQuery(QueryPool& queryPool, uint32_t offset);
void CopyQueries(const QueryPool& queryPool, uint32_t offset, uint32_t num, Buffer& dstBuffer, uint64_t dstOffset);
void BeginAnnotation(const char* name);
void BeginAnnotation(const char* name, uint32_t bgra);
void EndAnnotation();

private:
Expand Down
24 changes: 17 additions & 7 deletions Source/D3D11/CommandBufferD3D11.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// © 2021 NVIDIA Corporation

#include <pix.h>

static constexpr uint64_t s_nullOffsets[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT] = {0};

uint8_t QueryLatestDeviceContext(ComPtr<ID3D11DeviceContextBest>& in, ComPtr<ID3D11DeviceContextBest>& out) {
Expand Down Expand Up @@ -570,14 +572,22 @@ NRI_INLINE void CommandBufferD3D11::CopyQueries(const QueryPool& queryPool, uint
((BufferD3D11&)dstBuffer).AssignQueryPoolRange((QueryPoolD3D11*)&queryPool, offset, num, dstOffset);
}

NRI_INLINE void CommandBufferD3D11::BeginAnnotation(const char* name) {
size_t len = strlen(name) + 1;
Scratch<wchar_t> s = AllocateScratch(m_Device, wchar_t, len);
ConvertCharToWchar(name, s, len);

m_Annotation->BeginEvent(s);
NRI_INLINE void CommandBufferD3D11::BeginAnnotation(const char* name, uint32_t bgra) {
/*
// TODO: unfortunately, just a few tools support "BeginEventInt"
if (m_Version >= 2)
PIXBeginEvent(m_DeferredContext, bgra, name);
else
*/
PIXBeginEvent(m_Annotation, bgra, name);
}

NRI_INLINE void CommandBufferD3D11::EndAnnotation() {
m_Annotation->EndEvent();
/*
// TODO: unfortunately, just a few tools support "BeginEventInt"
if (m_Version >= 2)
PIXEndEvent(m_DeferredContext);
else
*/
PIXEndEvent(m_Annotation);
}
2 changes: 1 addition & 1 deletion Source/D3D11/CommandBufferEmuD3D11.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ struct CommandBufferEmuD3D11 final : public CommandBufferHelper {
void BeginQuery(QueryPool& queryPool, uint32_t offset);
void EndQuery(QueryPool& queryPool, uint32_t offset);
void CopyQueries(const QueryPool& queryPool, uint32_t offset, uint32_t num, Buffer& dstBuffer, uint64_t dstOffset);
void BeginAnnotation(const char* name);
void BeginAnnotation(const char* name, uint32_t bgra);
void EndAnnotation();

private:
Expand Down
8 changes: 6 additions & 2 deletions Source/D3D11/CommandBufferEmuD3D11.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,10 @@ void CommandBufferEmuD3D11::Submit() {
const char* name;
Read(m_PushBuffer, i, name, len);

commandBuffer.BeginAnnotation(name);
uint32_t bgra;
Read(m_PushBuffer, i, bgra);

commandBuffer.BeginAnnotation(name, bgra);
} break;
case END_ANNOTATION: {
commandBuffer.EndAnnotation();
Expand Down Expand Up @@ -717,11 +720,12 @@ NRI_INLINE void CommandBufferEmuD3D11::CopyQueries(const QueryPool& queryPool, u
Push(m_PushBuffer, dstOffset);
}

NRI_INLINE void CommandBufferEmuD3D11::BeginAnnotation(const char* name) {
NRI_INLINE void CommandBufferEmuD3D11::BeginAnnotation(const char* name, uint32_t bgra) {
uint32_t len = (uint32_t)std::strlen(name) + 1;

Push(m_PushBuffer, BEGIN_ANNOTATION);
Push(m_PushBuffer, name, len);
Push(m_PushBuffer, name, bgra);
}

NRI_INLINE void CommandBufferEmuD3D11::EndAnnotation() {
Expand Down
12 changes: 8 additions & 4 deletions Source/D3D11/ImplD3D11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -415,8 +415,8 @@ static void NRI_CALL CmdEndQuery(CommandBuffer& commandBuffer, QueryPool& queryP
((CommandBufferD3D11&)commandBuffer).EndQuery(queryPool, offset);
}

static void NRI_CALL CmdBeginAnnotation(CommandBuffer& commandBuffer, const char* name) {
((CommandBufferD3D11&)commandBuffer).BeginAnnotation(name);
static void NRI_CALL CmdBeginAnnotation(CommandBuffer& commandBuffer, const char* name, uint32_t bgra) {
((CommandBufferD3D11&)commandBuffer).BeginAnnotation(name, bgra);
}

static void NRI_CALL CmdEndAnnotation(CommandBuffer& commandBuffer) {
Expand Down Expand Up @@ -458,6 +458,9 @@ static void NRI_CALL CmdCopyQueries(CommandBuffer& commandBuffer, const QueryPoo
static void NRI_CALL CmdResetQueries(CommandBuffer&, QueryPool&, uint32_t, uint32_t) {
}

static void NRI_CALL ResetQueries(QueryPool&, uint32_t, uint32_t) {
}

static void* NRI_CALL GetCommandBufferNativeObject(const CommandBuffer& commandBuffer) {
if (!(&commandBuffer))
return nullptr;
Expand Down Expand Up @@ -589,8 +592,8 @@ static void NRI_CALL EmuCmdEndQuery(CommandBuffer& commandBuffer, QueryPool& que
((CommandBufferEmuD3D11&)commandBuffer).EndQuery(queryPool, offset);
}

static void NRI_CALL EmuCmdBeginAnnotation(CommandBuffer& commandBuffer, const char* name) {
((CommandBufferEmuD3D11&)commandBuffer).BeginAnnotation(name);
static void NRI_CALL EmuCmdBeginAnnotation(CommandBuffer& commandBuffer, const char* name, uint32_t bgra) {
((CommandBufferEmuD3D11&)commandBuffer).BeginAnnotation(name, bgra);
}

static void NRI_CALL EmuCmdEndAnnotation(CommandBuffer& commandBuffer) {
Expand Down Expand Up @@ -756,6 +759,7 @@ Result DeviceD3D11::FillFunctionTable(CoreInterface& table) const {
table.BindBufferMemory = ::BindBufferMemory;
table.BindTextureMemory = ::BindTextureMemory;
table.FreeMemory = ::FreeMemory;
table.ResetQueries = ::ResetQueries;
table.QueueSubmit = ::QueueSubmit;
table.Wait = ::Wait;
table.GetFenceValue = ::GetFenceValue;
Expand Down
2 changes: 1 addition & 1 deletion Source/D3D12/CommandBufferD3D12.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ struct CommandBufferD3D12 {
void BeginQuery(QueryPool& queryPool, uint32_t offset);
void EndQuery(QueryPool& queryPool, uint32_t offset);
void CopyQueries(const QueryPool& queryPool, uint32_t offset, uint32_t num, Buffer& buffer, uint64_t alignedBufferOffset);
void BeginAnnotation(const char* name);
void BeginAnnotation(const char* name, uint32_t bgra);
void EndAnnotation();
void BuildTopLevelAccelerationStructure(uint32_t instanceNum, const Buffer& buffer, uint64_t bufferOffset, AccelerationStructureBuildBits flags, AccelerationStructure& dst, Buffer& scratch, uint64_t scratchOffset);
void BuildBottomLevelAccelerationStructure(uint32_t geometryObjectNum, const GeometryObject* geometryObjects, AccelerationStructureBuildBits flags, AccelerationStructure& dst, Buffer& scratch, uint64_t scratchOffset);
Expand Down
8 changes: 2 additions & 6 deletions Source/D3D12/CommandBufferD3D12.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -932,12 +932,8 @@ NRI_INLINE void CommandBufferD3D12::CopyQueries(const QueryPool& queryPool, uint
m_GraphicsCommandList->ResolveQueryData(queryPoolD3D12, queryPoolD3D12.GetType(), offset, num, bufferD3D12, alignedBufferOffset);
}

NRI_INLINE void CommandBufferD3D12::BeginAnnotation(const char* name) {
size_t len = strlen(name) + 1;
Scratch<wchar_t> s = AllocateScratch(m_Device, wchar_t, len);
ConvertCharToWchar(name, s, len);

PIXBeginEvent(m_GraphicsCommandList, PIX_COLOR_DEFAULT, s);
NRI_INLINE void CommandBufferD3D12::BeginAnnotation(const char* name, uint32_t bgra) {
PIXBeginEvent(m_GraphicsCommandList, bgra, name);
}

NRI_INLINE void CommandBufferD3D12::EndAnnotation() {
Expand Down
8 changes: 6 additions & 2 deletions Source/D3D12/ImplD3D12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,8 @@ static void NRI_CALL CmdEndQuery(CommandBuffer& commandBuffer, QueryPool& queryP
((CommandBufferD3D12&)commandBuffer).EndQuery(queryPool, offset);
}

static void NRI_CALL CmdBeginAnnotation(CommandBuffer& commandBuffer, const char* name) {
((CommandBufferD3D12&)commandBuffer).BeginAnnotation(name);
static void NRI_CALL CmdBeginAnnotation(CommandBuffer& commandBuffer, const char* name, uint32_t bgra) {
((CommandBufferD3D12&)commandBuffer).BeginAnnotation(name, bgra);
}

static void NRI_CALL CmdEndAnnotation(CommandBuffer& commandBuffer) {
Expand Down Expand Up @@ -294,6 +294,9 @@ static void NRI_CALL CmdCopyQueries(CommandBuffer& commandBuffer, const QueryPoo
static void NRI_CALL CmdResetQueries(CommandBuffer&, QueryPool&, uint32_t, uint32_t) {
}

static void NRI_CALL ResetQueries(QueryPool&, uint32_t, uint32_t) {
}

static void* NRI_CALL GetCommandBufferNativeObject(const CommandBuffer& commandBuffer) {
if (!(&commandBuffer))
return nullptr;
Expand Down Expand Up @@ -632,6 +635,7 @@ Result DeviceD3D12::FillFunctionTable(CoreInterface& table) const {
table.CmdBeginAnnotation = ::CmdBeginAnnotation;
table.CmdEndAnnotation = ::CmdEndAnnotation;
table.EndCommandBuffer = ::EndCommandBuffer;
table.ResetQueries = ::ResetQueries;
table.QueueSubmit = ::QueueSubmit;
table.Wait = ::Wait;
table.GetFenceValue = ::GetFenceValue;
Expand Down
Loading

0 comments on commit c127288

Please sign in to comment.