Improve Vulkan barriers, clean up code a bit

This commit is contained in:
cdozdil
2026-02-10 17:40:48 +03:00
parent 3bf1c5df1c
commit eca6d08fc7
9 changed files with 126 additions and 125 deletions
@@ -6014,55 +6014,6 @@ VkResult Vulkan_wDx12::hk_vkQueueSubmit(VkQueue queue, uint32_t submitCount, VkS
LOG_DEBUG("queue: {:X}, submitCount: {}, fence: {:X}", (size_t) queue, submitCount, (size_t) fence);
#endif
// for (size_t a = 0; a < submitCount; a++)
//{
// LOG_DEBUG(" sType: {}", magic_enum::enum_name<VkStructureType>(pSubmits[a].sType));
// LOG_DEBUG(" Submit[{}]: cmdBufferCount: {}", a, pSubmits[a].commandBufferCount);
// for (size_t b = 0; b < pSubmits[a].commandBufferCount; b++)
// {
// LOG_DEBUG(" CmdBuffer[{}]: {:X}", b, (size_t) pSubmits[a].pCommandBuffers[b]);
// }
// LOG_DEBUG(" waitSemaphoreCount: {}", pSubmits[a].waitSemaphoreCount);
// for (size_t c = 0; c < pSubmits[a].waitSemaphoreCount; c++)
// {
// LOG_DEBUG(" WaitSemaphore[{}]: {:X}", c, (size_t) pSubmits[a].pWaitSemaphores[c]);
// }
// LOG_DEBUG(" signalSemaphoreCount: {}", pSubmits[a].signalSemaphoreCount);
// for (size_t d = 0; d < pSubmits[a].signalSemaphoreCount; d++)
// {
// LOG_DEBUG(" SignalSemaphore[{}]: {:X}", d, (size_t) pSubmits[a].pSignalSemaphores[d]);
// }
// LOG_DEBUG(" pNext chain:");
// VkDummyProps* next = (VkDummyProps*) &pSubmits[a];
// while (next->pNext != nullptr)
// {
// next = (VkDummyProps*) next->pNext;
// if (next->sType == VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO)
// {
// LOG_DEBUG(" sType: VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO");
// auto tlSemaphoreInfo = (VkTimelineSemaphoreSubmitInfo*) next;
// LOG_DEBUG(" waitSemaphoreValueCount: {}", tlSemaphoreInfo->waitSemaphoreValueCount);
// for (size_t e = 0; e < tlSemaphoreInfo->waitSemaphoreValueCount; e++)
// {
// LOG_DEBUG(" WaitSemaphoreValue[{}]: {}", e, tlSemaphoreInfo->pWaitSemaphoreValues[e]);
// }
// LOG_DEBUG(" signalSemaphoreValueCount: {}", tlSemaphoreInfo->signalSemaphoreValueCount);
// for (size_t f = 0; f < tlSemaphoreInfo->signalSemaphoreValueCount; f++)
// {
// LOG_DEBUG(" SignalSemaphoreValue[{}]: {}", f,
// tlSemaphoreInfo->pSignalSemaphoreValues[f]);
// }
// }
// else
// {
// LOG_DEBUG(" sType: {}", (UINT) next->sType);
// }
// }
//}
std::vector<VkSemaphore> semaphores;
std::vector<VkSubmitInfo> submitInfos;
std::vector<uint64_t> signalValues;
+1 -1
View File
@@ -22,7 +22,7 @@ class IFeature_Dx11 : public virtual IFeature
IFeature_Dx11(unsigned int InHandleId, NVSDK_NGX_Parameter* InParameters) : IFeature(InHandleId, InParameters) {}
bool IsWithDx12() { return false; }
bool IsWithDx12() override { return false; }
~IFeature_Dx11();
};
+1 -1
View File
@@ -87,7 +87,7 @@ class IFeature_Dx11wDx12 : public virtual IFeature_Dx11
IFeature_Dx11wDx12(unsigned int InHandleId, NVSDK_NGX_Parameter* InParameters);
bool IsWithDx12() { return true; }
bool IsWithDx12() final { return true; }
~IFeature_Dx11wDx12();
};
+1 -1
View File
@@ -28,7 +28,7 @@ class IFeature_Dx12 : public virtual IFeature
IFeature_Dx12(unsigned int InHandleId, NVSDK_NGX_Parameter* InParameters);
bool IsWithDx12() { return false; }
bool IsWithDx12() final { return false; }
~IFeature_Dx12();
};
+1 -1
View File
@@ -26,7 +26,7 @@ class IFeature_Vk : public virtual IFeature
IFeature_Vk(unsigned int InHandleId, NVSDK_NGX_Parameter* InParameters) : IFeature(InHandleId, InParameters) {}
bool IsWithDx12() { return false; }
bool IsWithDx12() override { return false; }
virtual ~IFeature_Vk() {}
};
+93 -35
View File
@@ -392,8 +392,8 @@ bool IFeature_VkwDx12::CreateVulkanCopyCommandBuffer()
return true;
}
// bool IFeature_VkwDx12::CopyVulkanImageToShared(::VkCommandBuffer InCmdBuffer, NVSDK_NGX_Resource_VK* InParam,
// ::VkImage InDestImage, bool IsDepth)
// bool IFeature_VkwDx12::CopyVulkanImageToShared(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Resource_VK* InParam,
// VkImage InDestImage, bool IsDepth)
//{
// LOG_FUNC();
//
@@ -683,7 +683,7 @@ bool IFeature_VkwDx12::CreateSharedTexture(const VkImageCreateInfo& ImageInfo, V
return true;
}
bool IFeature_VkwDx12::CopyTextureFromVkToDx12(::VkCommandBuffer InCmdBuffer, NVSDK_NGX_Resource_VK* InParam,
bool IFeature_VkwDx12::CopyTextureFromVkToDx12(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Resource_VK* InParam,
VK_TEXTURE2D_RESOURCE_C* OutResource, ResourceCopy_Vk* InCopyShader,
bool InCopy)
{
@@ -764,6 +764,41 @@ bool IFeature_VkwDx12::CopyTextureFromVkToDx12(::VkCommandBuffer InCmdBuffer, NV
return false;
}
if (InCopy)
{
VkImageMemoryBarrier imageBarrier {};
imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
imageBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
imageBarrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
imageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
imageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
imageBarrier.image = OutResource->VkSharedImage;
imageBarrier.subresourceRange = InParam->Resource.ImageViewInfo.SubresourceRange;
imageBarrier.srcAccessMask = 0;
imageBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
// Set initial state of the shared image
vkCmdPipelineBarrier(InCmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
0, nullptr, 0, nullptr, 1, &imageBarrier);
}
else
{
VkImageMemoryBarrier imageBarrier {};
imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
imageBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
imageBarrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
imageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
imageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
imageBarrier.image = OutResource->VkSharedImage;
imageBarrier.subresourceRange = InParam->Resource.ImageViewInfo.SubresourceRange;
imageBarrier.srcAccessMask = 0;
imageBarrier.dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
// Set initial state of the shared image
vkCmdPipelineBarrier(InCmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
0, nullptr, 0, nullptr, 1, &imageBarrier);
}
LOG_DEBUG("Successfully created shared texture");
// Verify the resource descriptor
@@ -917,7 +952,7 @@ bool IFeature_VkwDx12::CopyTextureFromVkToDx12(::VkCommandBuffer InCmdBuffer, NV
imageBarriers[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
imageBarriers[0].image = InParam->Resource.ImageViewInfo.Image;
imageBarriers[0].subresourceRange = InParam->Resource.ImageViewInfo.SubresourceRange;
imageBarriers[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
imageBarriers[0].srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
imageBarriers[0].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
imageBarriers[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
@@ -951,13 +986,15 @@ bool IFeature_VkwDx12::CopyTextureFromVkToDx12(::VkCommandBuffer InCmdBuffer, NV
vkCmdCopyImage(InCmdBuffer, imageBarriers[0].image, imageBarriers[0].newLayout,
imageBarriers[1].image, imageBarriers[1].newLayout, 1, &copyRegion);
// Restore source image to read layout
imageBarriers[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
imageBarriers[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
imageBarriers[0].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
imageBarriers[0].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
// Pass shared image to general layout for D3D12 access
imageBarriers[1].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
imageBarriers[1].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
imageBarriers[1].newLayout = VK_IMAGE_LAYOUT_GENERAL;
imageBarriers[1].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
imageBarriers[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
@@ -972,13 +1009,6 @@ bool IFeature_VkwDx12::CopyTextureFromVkToDx12(::VkCommandBuffer InCmdBuffer, NV
LOG_DEBUG("Vulkan texture copy recorded");
}
// else
//{
// VkClearColorValue debugColor = { { 1.0f, 0.0f, 0.0f, 1.0f } };
// vkCmdClearColorImage(InCmdBuffer, InParam->Resource.ImageViewInfo.Image, VK_IMAGE_LAYOUT_GENERAL,
// &debugColor,
// 1, &InParam->Resource.ImageViewInfo.SubresourceRange);
// }
return true;
}
@@ -991,7 +1021,7 @@ static bool NvVkResourceNotValid(NVSDK_NGX_Resource_VK* param)
param->Resource.ImageViewInfo.Height == 0;
}
bool IFeature_VkwDx12::ProcessVulkanTextures(::VkCommandBuffer InCmdList, const NVSDK_NGX_Parameter* InParameters)
bool IFeature_VkwDx12::ProcessVulkanTextures(VkCommandBuffer InCmdList, const NVSDK_NGX_Parameter* InParameters)
{
LOG_FUNC();
@@ -1002,13 +1032,13 @@ bool IFeature_VkwDx12::ProcessVulkanTextures(::VkCommandBuffer InCmdList, const
LOG_DEBUG("Upscaling command buffer: {:X}, frame: {}", (size_t) InCmdList, frame);
// Only wait if we're more than 1 frame behind (triple buffering protection)
// uint64_t lastFrameToWaitFor = (_frameCount > 1) ? (_frameCount - 1) : 0;
// if (Dx12Fence->GetCompletedValue() < lastFrameToWaitFor)
//{
// // Only wait for N-1 frame, not current frame
// Dx12Fence->SetEventOnCompletion(lastFrameToWaitFor, Dx12FenceEvent);
// WaitForSingleObject(Dx12FenceEvent, INFINITE);
//}
uint64_t lastFrameToWaitFor = (_frameCount > 1) ? (_frameCount - 1) : 0;
if (Dx12Fence->GetCompletedValue() < lastFrameToWaitFor)
{
// Only wait for N-1 frame, not current frame
Dx12Fence->SetEventOnCompletion(lastFrameToWaitFor, Dx12FenceEvent);
WaitForSingleObject(Dx12FenceEvent, INFINITE);
}
Dx12CommandAllocator[frame]->Reset();
Dx12CommandList[frame]->Reset(Dx12CommandAllocator[frame], nullptr);
@@ -1344,13 +1374,6 @@ bool IFeature_VkwDx12::ProcessVulkanTextures(::VkCommandBuffer InCmdList, const
vkCmdPipelineBarrier(VulkanBarrierCommandBuffer[frame], VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0,
nullptr, 0, nullptr, 1, &imageBarrier);
// vkResult = vkEndCommandBuffer(InCmdList);
// if (vkResult != VK_SUCCESS)
//{
// LOG_ERROR("vkEndCommandBuffer error: {0:x}", (int) vkResult);
// return false;
// }
}
// D3D12 wait on the shared fence signaled by Vulkan
@@ -1458,12 +1481,12 @@ bool IFeature_VkwDx12::CopyBackOutput()
}
// Signal for next frame
// result = Dx12CommandQueue->Signal(Dx12Fence, _frameCount);
// if (result != S_OK)
//{
// LOG_ERROR("Dx12CommandQueue->Signal failed: {0:x}", result);
// return false;
//}
result = Dx12CommandQueue->Signal(Dx12Fence, _frameCount);
if (result != S_OK)
{
LOG_ERROR("Dx12CommandQueue->Signal failed: {0:x}", result);
return false;
}
// D3D12 side is completed now copy back output to Vulkan image
if (vkOut.VkSourceImage != VK_NULL_HANDLE && vkOut.VkSharedImage != VK_NULL_HANDLE)
@@ -1488,6 +1511,41 @@ bool IFeature_VkwDx12::CopyBackOutput()
return false;
}
std::vector<VkImageMemoryBarrier> imageBarriers;
imageBarriers.reserve(5);
auto AddVkBarrier = [&](VK_TEXTURE2D_RESOURCE_C* resource)
{
if (resource->VkSourceImage != VK_NULL_HANDLE)
{
VkImageMemoryBarrier imageBarrier {};
imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
imageBarrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
imageBarrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
imageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
imageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
imageBarrier.image = resource->VkSharedImage;
imageBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
imageBarrier.subresourceRange.baseMipLevel = 0;
imageBarrier.subresourceRange.levelCount = 1;
imageBarrier.subresourceRange.baseArrayLayer = 0;
imageBarrier.subresourceRange.layerCount = 1;
imageBarrier.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
imageBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
imageBarriers.push_back(imageBarrier);
}
};
AddVkBarrier(&vkColor);
AddVkBarrier(&vkDepth);
AddVkBarrier(&vkMv);
AddVkBarrier(&vkExp);
AddVkBarrier(&vkReactive);
vkCmdPipelineBarrier(VulkanCopyCommandBuffer[frame], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr,
0, nullptr, imageBarriers.size(), imageBarriers.data());
if (false)
{
@@ -2090,8 +2148,8 @@ HRESULT IFeature_VkwDx12::CreateDx12Device()
return S_OK;
}
bool IFeature_VkwDx12::BaseInit(::VkInstance InInstance, ::VkPhysicalDevice InPD, ::VkDevice InDevice,
::VkCommandBuffer InCmdList, PFN_vkGetInstanceProcAddr InGIPA,
bool IFeature_VkwDx12::BaseInit(VkInstance InInstance, VkPhysicalDevice InPD, VkDevice InDevice,
VkCommandBuffer InCmdList, PFN_vkGetInstanceProcAddr InGIPA,
PFN_vkGetDeviceProcAddr InGDPA, NVSDK_NGX_Parameter* InParameters)
{
LOG_FUNC();
+24 -32
View File
@@ -38,15 +38,15 @@ class IFeature_VkwDx12 : public virtual IFeature_Vk
};
// Vulkan context - renamed to avoid conflicts
::VkDevice VulkanDevice = VK_NULL_HANDLE;
::VkPhysicalDevice VulkanPhysicalDevice = VK_NULL_HANDLE;
::VkInstance VulkanInstance = VK_NULL_HANDLE;
::VkQueue VulkanGraphicsQueue = VK_NULL_HANDLE;
VkDevice VulkanDevice = VK_NULL_HANDLE;
VkPhysicalDevice VulkanPhysicalDevice = VK_NULL_HANDLE;
VkInstance VulkanInstance = VK_NULL_HANDLE;
VkQueue VulkanGraphicsQueue = VK_NULL_HANDLE;
VkCommandBuffer VulkanCopyCommandBuffer[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
VkCommandPool VulkanCopyCommandPool[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
VkCommandBuffer VulkanBarrierCommandBuffer[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
VkCommandPool VulkanBarrierCommandPool[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
uint32_t VulkanQueueFamilyIndex = 0;
::VkCommandBuffer VulkanCopyCommandBuffer[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
::VkCommandPool VulkanCopyCommandPool[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
::VkCommandBuffer VulkanBarrierCommandBuffer[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
::VkCommandPool VulkanBarrierCommandPool[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
PFN_vkGetInstanceProcAddr VulkanGIPA = nullptr;
PFN_vkGetDeviceProcAddr VulkanGDPA = nullptr;
@@ -67,8 +67,8 @@ class IFeature_VkwDx12 : public virtual IFeature_Vk
VK_TEXTURE2D_RESOURCE_C vkOut = {};
// Vulkan synchronization for texture copies - using shared fence pattern like Dx11wDx12
::VkSemaphore vkSemaphoreTextureCopy[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
::VkSemaphore vkSemaphoreCopyBack[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
VkSemaphore vkSemaphoreTextureCopy[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
VkSemaphore vkSemaphoreCopyBack[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
ID3D12Fence* dx12FenceTextureCopy[2] = { nullptr, nullptr };
HANDLE vkSHForTextureCopy[2] = { nullptr, nullptr };
ULONG _fenceValue = 0;
@@ -89,8 +89,6 @@ class IFeature_VkwDx12 : public virtual IFeature_Vk
std::unique_ptr<ResourceCopy_Vk> OutCopy2 = nullptr;
// Vulkan function pointers for external memory
// PFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHR = nullptr;
// PFN_vkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHR = nullptr;
PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR = nullptr;
PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR = nullptr;
@@ -101,41 +99,35 @@ class IFeature_VkwDx12 : public virtual IFeature_Vk
bool CreateSharedTexture(const VkImageCreateInfo& ImageInfo, VkImage& VulkanResource, VkDeviceMemory& VulkanMemory,
ID3D12Resource*& D3D12Resource, bool InOutput);
bool CopyTextureFromVkToDx12(::VkCommandBuffer InCmdBuffer, NVSDK_NGX_Resource_VK* InParam,
bool CopyTextureFromVkToDx12(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Resource_VK* InParam,
VK_TEXTURE2D_RESOURCE_C* OutResource, ResourceCopy_Vk* InCopyShader, bool InCopy);
bool ProcessVulkanTextures(::VkCommandBuffer InCmdList, const NVSDK_NGX_Parameter* InParameters);
bool ProcessVulkanTextures(VkCommandBuffer InCmdList, const NVSDK_NGX_Parameter* InParameters);
bool CopyBackOutput();
// bool CopyVulkanImageToShared(::VkCommandBuffer InCmdBuffer, NVSDK_NGX_Resource_VK* InParam, ::VkImage
// InDestImage,
// bool IsDepth);
void ResourceBarrier(ID3D12GraphicsCommandList* InCommandList, ID3D12Resource* InResource,
D3D12_RESOURCE_STATES InBeforeState, D3D12_RESOURCE_STATES InAfterState);
void ReleaseSharedResources();
void ReleaseSyncResources();
void SetVkObjectName(VkDevice device, VkObjectType objectType, uint64_t objectHandle, const char* name);
uint32_t FindVulkanMemoryTypeIndex(uint32_t MemoryTypeBits, VkMemoryPropertyFlags PropertyFlags);
bool LoadVulkanExternalMemoryFunctions();
bool CreateVulkanCopyCommandBuffer();
bool CreateSharedFenceSemaphore();
uint32_t FindVulkanMemoryTypeIndex(uint32_t MemoryTypeBits, VkMemoryPropertyFlags PropertyFlags);
void ReleaseSharedResources();
void ReleaseSyncResources();
public:
virtual bool Init(::VkInstance InInstance, ::VkPhysicalDevice InPD, ::VkDevice InDevice,
::VkCommandBuffer InCmdList, PFN_vkGetInstanceProcAddr InGIPA, PFN_vkGetDeviceProcAddr InGDPA,
NVSDK_NGX_Parameter* InParameters) = 0;
bool IsWithDx12() final { return true; }
virtual bool Evaluate(::VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter* InParameters) = 0;
bool BaseInit(::VkInstance InInstance, ::VkPhysicalDevice InPD, ::VkDevice InDevice, ::VkCommandBuffer InCmdList,
bool BaseInit(VkInstance InInstance, VkPhysicalDevice InPD, VkDevice InDevice, VkCommandBuffer InCmdList,
PFN_vkGetInstanceProcAddr InGIPA, PFN_vkGetDeviceProcAddr InGDPA, NVSDK_NGX_Parameter* InParameters);
IFeature_VkwDx12(unsigned int InHandleId, NVSDK_NGX_Parameter* InParameters);
bool IsWithDx12() { return true; }
~IFeature_VkwDx12();
virtual bool Init(VkInstance InInstance, VkPhysicalDevice InPD, VkDevice InDevice, VkCommandBuffer InCmdList,
PFN_vkGetInstanceProcAddr InGIPA, PFN_vkGetDeviceProcAddr InGDPA,
NVSDK_NGX_Parameter* InParameters) = 0;
virtual bool Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter* InParameters) = 0;
};
@@ -27,8 +27,8 @@ FSR31FeatureVkOn12::FSR31FeatureVkOn12(unsigned int InHandleId, NVSDK_NGX_Parame
LOG_ERROR("can't load amd_fidelityfx_dx12.dll methods!");
}
bool FSR31FeatureVkOn12::Init(::VkInstance InInstance, ::VkPhysicalDevice InPD, ::VkDevice InDevice,
::VkCommandBuffer InCmdList, PFN_vkGetInstanceProcAddr InGIPA,
bool FSR31FeatureVkOn12::Init(VkInstance InInstance, VkPhysicalDevice InPD, VkDevice InDevice,
VkCommandBuffer InCmdList, PFN_vkGetInstanceProcAddr InGIPA,
PFN_vkGetDeviceProcAddr InGDPA, NVSDK_NGX_Parameter* InParameters)
{
LOG_FUNC();
@@ -47,7 +47,7 @@ bool FSR31FeatureVkOn12::Init(::VkInstance InInstance, ::VkPhysicalDevice InPD,
return _moduleLoaded;
}
bool FSR31FeatureVkOn12::Evaluate(::VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter* InParameters)
bool FSR31FeatureVkOn12::Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter* InParameters)
{
LOG_FUNC();
@@ -20,11 +20,11 @@ class FSR31FeatureVkOn12 : public FSR31Feature, public IFeature_VkwDx12
FSR31FeatureVkOn12(unsigned int InHandleId, NVSDK_NGX_Parameter* InParameters);
bool Init(::VkInstance InInstance, ::VkPhysicalDevice InPD, ::VkDevice InDevice, ::VkCommandBuffer InCmdList,
bool Init(VkInstance InInstance, VkPhysicalDevice InPD, VkDevice InDevice, VkCommandBuffer InCmdList,
PFN_vkGetInstanceProcAddr InGIPA, PFN_vkGetDeviceProcAddr InGDPA,
NVSDK_NGX_Parameter* InParameters) override;
bool Evaluate(::VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter* InParameters) override;
bool Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter* InParameters) override;
~FSR31FeatureVkOn12()
{