mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-08-24 23:26:50 +00:00
Improve Vulkan barriers, clean up code a bit
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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() {}
|
||||
};
|
||||
|
||||
@@ -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, ©Region);
|
||||
|
||||
// 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();
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user