// Copyright Epic Games, Inc. All Rights Reserved. /*============================================================================= VulkanDynamicRHI.h: Vulkan RHI definitions. =============================================================================*/ #pragma once #include "IVulkanDynamicRHI.h" #include "VulkanConfiguration.h" #include "VulkanQueue.h" class FVulkanFramebuffer; class FVulkanDevice; class FVulkanUniformBuffer; class FVulkanViewport; class FVulkanPayload; class FVulkanTexture; class IHeadMountedDisplayVulkanExtensions; class FVulkanThread; struct FRHITransientHeapAllocation; struct FVulkanPlatformCommandList; namespace VulkanRHI { class FSemaphore; }; struct FOptionalVulkanInstanceExtensions { union { struct { UE_DEPRECATED(5.3, "Vulkan 1.1 is now a requirement so there is no need to check these capabilities.") uint32 HasKHRExternalMemoryCapabilities : 1; UE_DEPRECATED(5.3, "Vulkan 1.1 is now a requirement so there is no need to check these capabilities.") uint32 HasKHRGetPhysicalDeviceProperties2 : 1; }; uint32 Packed; }; FOptionalVulkanInstanceExtensions() { static_assert(sizeof(Packed) == sizeof(FOptionalVulkanInstanceExtensions), "More bits needed!"); Packed = 0; } }; #if RHI_NEW_GPU_PROFILER // Encapsulates the state required for tracking GPU queue performance across a frame. class FVulkanTiming { public: FVulkanTiming(FVulkanQueue& InQueue); FVulkanQueue& Queue; // Timer calibration data uint64 GPUFrequency = 0, GPUTimestamp = 0; uint64 CPUFrequency = 0, CPUTimestamp = 0; UE::RHI::GPUProfiler::FEventStream EventStream; }; #endif PRAGMA_DISABLE_DEPRECATION_WARNINGS /** The interface which is implemented by the dynamically bound RHI. */ class FVulkanDynamicRHI : public IVulkanDynamicRHI { public: static FVulkanDynamicRHI& Get() { return *GetDynamicRHI(); } /** Initialization constructor. */ FVulkanDynamicRHI(); /** Destructor */ ~FVulkanDynamicRHI(); // IVulkanDynamicRHI interface virtual uint32 RHIGetVulkanVersion() const final override; virtual VkInstance RHIGetVkInstance() const final override; virtual VkDevice RHIGetVkDevice() const final override; virtual const uint8* RHIGetVulkanDeviceUUID() const final override; virtual VkPhysicalDevice RHIGetVkPhysicalDevice() const final override; virtual const VkAllocationCallbacks* RHIGetVkAllocationCallbacks() final override; virtual VkQueue RHIGetGraphicsVkQueue() const final override; virtual uint32 RHIGetGraphicsQueueIndex() const final override; virtual uint32 RHIGetGraphicsQueueFamilyIndex() const final override; virtual VkCommandBuffer RHIGetActiveVkCommandBuffer() final override; virtual uint64 RHIGetGraphicsAdapterLUID(VkPhysicalDevice InPhysicalDevice) const final override; virtual bool RHIDoesAdapterMatchDevice(const void* InAdapterId) const final override; virtual void* RHIGetVkDeviceProcAddr(const char* InName) const final override; virtual void* RHIGetVkInstanceProcAddr(const char* InName) const final override; virtual void* RHIGetVkInstanceGlobalProcAddr(const char* InName) const final override; virtual VkFormat RHIGetSwapChainVkFormat(EPixelFormat InFormat) const final override; virtual bool RHISupportsEXTFragmentDensityMap2() const final override; virtual TArray RHIGetAllInstanceExtensions() const final override; virtual TArray RHIGetAllDeviceExtensions(VkPhysicalDevice InPhysicalDevice) const final override; virtual TArray RHIGetLoadedDeviceExtensions() const final override; virtual FTextureRHIRef RHICreateTexture2DFromResource(EPixelFormat Format, uint32 SizeX, uint32 SizeY, uint32 NumMips, uint32 NumSamples, VkImage Resource, ETextureCreateFlags Flags, const FClearValueBinding& ClearValueBinding = FClearValueBinding::Transparent, const FVulkanRHIExternalImageDeleteCallbackInfo& ExternalImageDeleteCallbackInfo = {}) final override; #if PLATFORM_ANDROID virtual FTextureRHIRef RHICreateTexture2DFromAndroidHardwareBuffer(AHardwareBuffer* HardwareBuffer) final override; #endif virtual FTextureRHIRef RHICreateTexture2DArrayFromResource(EPixelFormat Format, uint32 SizeX, uint32 SizeY, uint32 ArraySize, uint32 NumMips, uint32 NumSamples, VkImage Resource, ETextureCreateFlags Flags, const FClearValueBinding& ClearValueBinding = FClearValueBinding::Transparent) final override; virtual FTextureRHIRef RHICreateTextureCubeFromResource(EPixelFormat Format, uint32 Size, bool bArray, uint32 ArraySize, uint32 NumMips, VkImage Resource, ETextureCreateFlags Flags, const FClearValueBinding& ClearValueBinding = FClearValueBinding::Transparent) final override; virtual VkImage RHIGetVkImage(FRHITexture* InTexture) const final override; virtual VkFormat RHIGetViewVkFormat(FRHITexture* InTexture) const final override; virtual FVulkanRHIAllocationInfo RHIGetAllocationInfo(FRHITexture* InTexture) const final override; virtual FVulkanRHIImageViewInfo RHIGetImageViewInfo(FRHITexture* InTexture) const final override; virtual FVulkanRHIAllocationInfo RHIGetAllocationInfo(FRHIBuffer* InBuffer) const final override; virtual void RHISetImageLayout(VkImage Image, VkImageLayout OldLayout, VkImageLayout NewLayout, const VkImageSubresourceRange& SubresourceRange) final override; virtual void RHISetUploadImageLayout(VkImage Image, VkImageLayout OldLayout, VkImageLayout NewLayout, const VkImageSubresourceRange& SubresourceRange) final override; virtual void RHIFinishExternalComputeWork(VkCommandBuffer InCommandBuffer) final override; virtual void RHIRegisterWork(uint32 NumPrimitives) final override; virtual void RHISubmitUploadCommandBuffer() final override; virtual void RHIVerifyResult(VkResult Result, const ANSICHAR* VkFuntion, const ANSICHAR* Filename, uint32 Line) final override; // FDynamicRHI interface. virtual void Init() final override; virtual void PostInit() final override; virtual void Shutdown() final override; virtual const TCHAR* GetName() final override { return TEXT("Vulkan"); } void InitInstance(); virtual void RHIEndFrame_RenderThread(FRHICommandListImmediate& RHICmdList) final override; virtual void RHIEndFrame(const FRHIEndFrameArgs& Args) final override; virtual FSamplerStateRHIRef RHICreateSamplerState(const FSamplerStateInitializerRHI& Initializer) final override; virtual FRasterizerStateRHIRef RHICreateRasterizerState(const FRasterizerStateInitializerRHI& Initializer) final override; virtual FDepthStencilStateRHIRef RHICreateDepthStencilState(const FDepthStencilStateInitializerRHI& Initializer) final override; virtual FBlendStateRHIRef RHICreateBlendState(const FBlendStateInitializerRHI& Initializer) final override; virtual FVertexDeclarationRHIRef RHICreateVertexDeclaration(const FVertexDeclarationElementList& Elements) final override; virtual FPixelShaderRHIRef RHICreatePixelShader(TArrayView Code, const FSHAHash& Hash) final override; virtual FVertexShaderRHIRef RHICreateVertexShader(TArrayView Code, const FSHAHash& Hash) final override; virtual FMeshShaderRHIRef RHICreateMeshShader(TArrayView Code, const FSHAHash& Hash) final override; virtual FAmplificationShaderRHIRef RHICreateAmplificationShader(TArrayView Code, const FSHAHash& Hash) final override; virtual FGeometryShaderRHIRef RHICreateGeometryShader(TArrayView Code, const FSHAHash& Hash) final override; virtual FComputeShaderRHIRef RHICreateComputeShader(TArrayView Code, const FSHAHash& Hash) final override; virtual FGPUFenceRHIRef RHICreateGPUFence(const FName &Name) final override; virtual void RHIWriteGPUFence_TopOfPipe(FRHICommandListBase& RHICmdList, FRHIGPUFence* FenceRHI) final override; virtual void RHICreateTransition(FRHITransition* Transition, const FRHITransitionCreateInfo& CreateInfo) final override; virtual void RHIReleaseTransition(FRHITransition* Transition) final override; virtual FStagingBufferRHIRef RHICreateStagingBuffer() final override; virtual FBoundShaderStateRHIRef RHICreateBoundShaderState(FRHIVertexDeclaration* VertexDeclaration, FRHIVertexShader* VertexShader, FRHIPixelShader* PixelShader, FRHIGeometryShader* GeometryShader) final override; virtual FGraphicsPipelineStateRHIRef RHICreateGraphicsPipelineState(const FGraphicsPipelineStateInitializer& Initializer) final override; virtual FComputePipelineStateRHIRef RHICreateComputePipelineState(const FComputePipelineStateInitializer& Initializer) final override; virtual FUniformBufferRHIRef RHICreateUniformBuffer(const void* Contents, const FRHIUniformBufferLayout* Layout, EUniformBufferUsage Usage, EUniformBufferValidation Validation) final override; virtual void RHIUpdateUniformBuffer(FRHICommandListBase& RHICmdList, FRHIUniformBuffer* UniformBufferRHI, const void* Contents) final override; [[nodiscard]] virtual FRHIBufferInitializer RHICreateBufferInitializer(FRHICommandListBase& RHICmdList, const FRHIBufferCreateDesc& CreateDesc) final override; virtual void RHIReplaceResources(FRHICommandListBase& RHICmdList, TArray&& ReplaceInfos) final override; virtual void* LockBuffer_BottomOfPipe(FRHICommandListBase& RHICmdList, FRHIBuffer* Buffer, uint32 Offset, uint32 Size, EResourceLockMode LockMode) final override; virtual void UnlockBuffer_BottomOfPipe(FRHICommandListBase& RHICmdList, FRHIBuffer* Buffer) final override; virtual void* RHILockBuffer(FRHICommandListBase& RHICmdList, FRHIBuffer* BufferRHI, uint32 Offset, uint32 Size, EResourceLockMode LockMode) final override; virtual void RHIUnlockBuffer(FRHICommandListBase& RHICmdList, FRHIBuffer* Buffer) final override; #if ENABLE_LOW_LEVEL_MEM_TRACKER || UE_MEMORY_TRACE_ENABLED virtual void RHIUpdateAllocationTags(FRHICommandListBase& RHICmdList, FRHIBuffer* Buffer) final override; #endif virtual FTextureReferenceRHIRef RHICreateTextureReference(FRHICommandListBase& RHICmdList, FRHITexture* InReferencedTexture) final override; virtual void RHIUpdateTextureReference(FRHICommandListBase& RHICmdList, FRHITextureReference* TextureRef, FRHITexture* NewTexture) final override; virtual FRHICalcTextureSizeResult RHICalcTexturePlatformSize(FRHITextureDesc const& Desc, uint32 FirstMipIndex) final override; virtual void RHIGetTextureMemoryStats(FTextureMemoryStats& OutStats) final override; virtual bool RHIGetTextureMemoryVisualizeData(FColor* TextureData, int32 SizeX, int32 SizeY, int32 Pitch, int32 PixelSize) final override; struct FCreateTextureResult { FVulkanTexture* Texture; VkImageLayout DefaultLayout; bool bTransientResource; bool bClear; }; FCreateTextureResult BeginCreateTextureInternal(const FRHITextureCreateDesc& CreateDesc, const FRHITransientHeapAllocation* InTransientHeapAllocation); FVulkanTexture* FinalizeCreateTextureInternal(FRHICommandListBase& RHICmdList, FCreateTextureResult CreateResult); FVulkanTexture* CreateTextureInternal(FRHICommandListBase& RHICmdList, const FRHITextureCreateDesc& CreateDesc); FVulkanTexture* CreateTextureInternal(const FRHITextureCreateDesc& CreateDesc, const FRHITransientHeapAllocation& InTransientHeapAllocation); [[nodiscard]] virtual FRHITextureInitializer RHICreateTextureInitializer(FRHICommandListBase& RHICmdList, const FRHITextureCreateDesc& CreateDesc); virtual FTextureRHIRef RHIAsyncCreateTexture2D(uint32 SizeX, uint32 SizeY, uint8 Format, uint32 NumMips, ETextureCreateFlags Flags, ERHIAccess InResourceState, void** InitialMipData, uint32 NumInitialMips, const TCHAR* DebugName, FGraphEventRef& OutCompletionEvent) final override; virtual uint32 RHIComputeMemorySize(FRHITexture* TextureRHI) final override; virtual FTextureRHIRef RHIAsyncReallocateTexture2D(FRHITexture* Texture2D, int32 NewMipCount, int32 NewSizeX, int32 NewSizeY, FThreadSafeCounter* RequestStatus) final override; virtual FRHILockTextureResult RHILockTexture(FRHICommandListImmediate& RHICmdList, const FRHILockTextureArgs& Arguments) final override; virtual void RHIUnlockTexture(FRHICommandListImmediate& RHICmdList, const FRHILockTextureArgs& Arguments) final override; virtual void RHIUpdateTexture2D(FRHICommandListBase& RHICmdList, FRHITexture* Texture, uint32 MipIndex, const struct FUpdateTextureRegion2D& UpdateRegion, uint32 SourcePitch, const uint8* SourceData) final override { InternalUpdateTexture2D(RHICmdList, Texture, MipIndex, UpdateRegion, SourcePitch, SourceData); } virtual void RHIUpdateTexture3D(FRHICommandListBase& RHICmdList, FRHITexture* Texture, uint32 MipIndex, const struct FUpdateTextureRegion3D& UpdateRegion, uint32 SourceRowPitch, uint32 SourceDepthPitch, const uint8* SourceData) final override { InternalUpdateTexture3D(RHICmdList, Texture, MipIndex, UpdateRegion, SourceRowPitch, SourceDepthPitch, SourceData); } virtual void RHIBindDebugLabelName(FRHICommandListBase& RHICmdList, FRHITexture* Texture, const TCHAR* Name) final override; virtual void RHIReadSurfaceData(FRHITexture* Texture, FIntRect Rect, TArray& OutData, FReadSurfaceDataFlags InFlags) final override; virtual void RHIReadSurfaceData(FRHITexture* Texture, FIntRect Rect, TArray& OutData, FReadSurfaceDataFlags InFlags) final override; virtual void RHIMapStagingSurface(FRHITexture* Texture, FRHIGPUFence* Fence, void*& OutData, int32& OutWidth, int32& OutHeight, uint32 GPUIndex = 0) final override; virtual void RHIUnmapStagingSurface(FRHITexture* Texture, uint32 GPUIndex = 0) final override; virtual void RHIReadSurfaceFloatData(FRHITexture* Texture, FIntRect Rect, TArray& OutData, ECubeFace CubeFace, int32 ArrayIndex, int32 MipIndex) final override; virtual void RHIRead3DSurfaceFloatData(FRHITexture* Texture, FIntRect Rect, FIntPoint ZMinMax, TArray& OutData) final override; virtual FRenderQueryRHIRef RHICreateRenderQuery(ERenderQueryType QueryType) final override; virtual void RHIEndRenderQuery_TopOfPipe(FRHICommandListBase& RHICmdList, FRHIRenderQuery* RenderQuery) final override; virtual void RHIBeginRenderQueryBatch_TopOfPipe(FRHICommandListBase& RHICmdList, ERenderQueryType QueryType) final override; virtual void RHIEndRenderQueryBatch_TopOfPipe(FRHICommandListBase& RHICmdList, ERenderQueryType QueryType) final override; virtual bool RHIGetRenderQueryResult(FRHIRenderQuery* RenderQuery, uint64& OutResult, bool bWait, uint32 GPUIndex = INDEX_NONE) final override; virtual FTextureRHIRef RHIGetViewportBackBuffer(FRHIViewport* Viewport) final override; virtual void RHIAliasTextureResources(FTextureRHIRef& DestTexture, FTextureRHIRef& SrcTexture) final override; virtual FTextureRHIRef RHICreateAliasedTexture(FTextureRHIRef& SourceTexture) final override; virtual void RHIAdvanceFrameForGetViewportBackBuffer(FRHIViewport* Viewport) final override; virtual void RHIFlushResources() final override; virtual FViewportRHIRef RHICreateViewport(void* WindowHandle, uint32 SizeX, uint32 SizeY, bool bIsFullscreen, EPixelFormat PreferredPixelFormat) final override; virtual void RHIResizeViewport(FRHIViewport* Viewport, uint32 SizeX, uint32 SizeY, bool bIsFullscreen) final override; virtual void RHIResizeViewport(FRHIViewport* Viewport, uint32 SizeX, uint32 SizeY, bool bIsFullscreen, EPixelFormat PreferredPixelFormat) final override; virtual void RHITick(float DeltaTime) final override; virtual void RHIBlockUntilGPUIdle() final override; virtual void RHISuspendRendering() final override; virtual void RHIResumeRendering() final override; virtual bool RHIIsRenderingSuspended() final override; virtual bool RHIGetAvailableResolutions(FScreenResolutionArray& Resolutions, bool bIgnoreRefreshRate) final override; virtual void RHIGetSupportedResolution(uint32& Width, uint32& Height) final override; virtual void* RHIGetNativeDevice() final override; virtual void* RHIGetNativePhysicalDevice() final override; virtual void* RHIGetNativeGraphicsQueue() final override; virtual void* RHIGetNativeComputeQueue() final override; virtual void* RHIGetNativeInstance() final override; virtual class IRHICommandContext* RHIGetDefaultContext() final override; virtual IRHIComputeContext* RHIGetCommandContext(ERHIPipeline Pipeline, FRHIGPUMask GPUMask) final override; virtual IRHIUploadContext* RHIGetUploadContext() final override; virtual void RHIFinalizeContext(FRHIFinalizeContextArgs&& Args, TRHIPipelineArray& Output) final override; virtual void RHISubmitCommandLists(FRHISubmitCommandListsArgs&& Args) final override; virtual uint64 RHIGetMinimumAlignmentForBufferBackedSRV(EPixelFormat Format) final override; virtual IRHIComputeContext* RHIGetParallelCommandContext(FRHIParallelRenderPassInfo const& ParallelRenderPass, FRHIGPUMask GPUMask) final override; virtual IRHIPlatformCommandList* RHIFinalizeParallelContext(IRHIComputeContext* Context) final override; // Transient Resource Functions and Helpers virtual IRHITransientResourceAllocator* RHICreateTransientResourceAllocator() final override; // version of the RHIComputePrecachePSOHash static uint32 GetPrecachePSOHashVersion(); virtual uint64 RHIComputePrecachePSOHash(const FGraphicsPipelineStateInitializer& Initializer) final override; virtual uint64 RHIComputeStatePrecachePSOHash(const FGraphicsPipelineStateInitializer& Initializer) final override; virtual bool RHIMatchPrecachePSOInitializers(const FGraphicsPipelineStateInitializer& LHS, const FGraphicsPipelineStateInitializer& RHS) final override; virtual FTextureRHIRef AsyncReallocateTexture2D_RenderThread(class FRHICommandListImmediate& RHICmdList, FRHITexture* Texture2D, int32 NewMipCount, int32 NewSizeX, int32 NewSizeY, FThreadSafeCounter* RequestStatus) override final; virtual FUpdateTexture3DData RHIBeginUpdateTexture3D(FRHICommandListBase& RHICmdList, FRHITexture* Texture, uint32 MipIndex, const struct FUpdateTextureRegion3D& UpdateRegion) override final; virtual void RHIEndUpdateTexture3D(FRHICommandListBase& RHICmdList, FUpdateTexture3DData& UpdateData) override final; // SRV / UAV creation functions virtual FShaderResourceViewRHIRef RHICreateShaderResourceView (class FRHICommandListBase& RHICmdList, FRHIViewableResource* Resource, FRHIViewDesc const& ViewDesc) final override; virtual FUnorderedAccessViewRHIRef RHICreateUnorderedAccessView(class FRHICommandListBase& RHICmdList, FRHIViewableResource* Resource, FRHIViewDesc const& ViewDesc) final override; #if PLATFORM_SUPPORTS_BINDLESS_RENDERING virtual FRHIResourceCollectionRef RHICreateResourceCollection(FRHICommandListBase& RHICmdList, TConstArrayView InMembers) final; #endif virtual FRayTracingAccelerationStructureSize RHICalcRayTracingSceneSize(const FRayTracingSceneInitializer& Initializer) final override; virtual FRayTracingAccelerationStructureSize RHICalcRayTracingGeometrySize(const FRayTracingGeometryInitializer& Initializer) final override; virtual FRayTracingGeometryRHIRef RHICreateRayTracingGeometry(FRHICommandListBase& RHICmdList, const FRayTracingGeometryInitializer& Initializer) final override; virtual FRayTracingSceneRHIRef RHICreateRayTracingScene(FRayTracingSceneInitializer Initializer) final override; virtual FRayTracingShaderRHIRef RHICreateRayTracingShader(TArrayView Code, const FSHAHash& Hash, EShaderFrequency ShaderFrequency) final override; virtual FRayTracingPipelineStateRHIRef RHICreateRayTracingPipelineState(const FRayTracingPipelineStateInitializer& Initializer) final override; virtual FShaderBindingTableRHIRef RHICreateShaderBindingTable(FRHICommandListBase& RHICmdList, const FRayTracingShaderBindingTableInitializer& Initializer) final override; // Historical number of times we've presented any and all viewports uint32 TotalPresentCount = 0; const TArray& GetInstanceExtensions() const { return InstanceExtensions; } const TArray& GetInstanceLayers() const { return InstanceLayers; } VkInstance GetInstance() const { return Instance; } FVulkanDevice* GetDevice() const { return Device; } bool SupportsDebugUtilsExt() const { return (ActiveDebugLayerExtension == EActiveDebugLayerExtension::DebugUtilsExtension); } const FOptionalVulkanInstanceExtensions& GetOptionalExtensions() const { return OptionalInstanceExtensions; } void VulkanSetImageLayout( VkCommandBuffer CmdBuffer, VkImage Image, VkImageLayout OldLayout, VkImageLayout NewLayout, const VkImageSubresourceRange& SubresourceRange ); virtual void* RHILockStagingBuffer(FRHIStagingBuffer* StagingBuffer, FRHIGPUFence* Fence, uint32 Offset, uint32 SizeRHI) final override; virtual void RHIUnlockStagingBuffer(FRHIStagingBuffer* StagingBuffer) final override; TArray& GetViewports() { return Viewports; } uint32 GetApiVersion() const { return ApiVersion; } // Runs code on SubmissionThread with access to VkQueue. Useful for plugins. virtual void RHIRunOnQueue(EVulkanRHIRunOnQueueType QueueType, TFunction&& CodeToRun, bool bWaitForSubmission) final override; public: static void SavePipelineCache(); void ProcessInterruptQueueUntil(FGraphEvent* GraphEvent); void EnqueueEndOfPipeTask(TUniqueFunction TaskFunc, TUniqueFunction ModifyPayloadCallback = {}); void CompletePayload(FVulkanPayload* Payload); protected: void InitializeSubmissionPipe(); void ShutdownSubmissionPipe(); bool ProcessSubmissionQueue(); bool ProcessInterruptQueue(); bool WaitAndProcessInterruptQueue(); void KickSubmissionThread(); void KickInterruptThread(); #if RHI_NEW_GPU_PROFILER struct FVulkanTimingArray : public TArray, TInlineAllocator<(int32)EVulkanQueueType::Count>> { FVulkanTiming* CreateNew(FVulkanQueue& Queue) { return Emplace_GetRef(MakeUnique(Queue)).Get(); } }; FVulkanTimingArray CurrentTimingPerQueue; #endif FCriticalSection SubmissionCS; FVulkanThread* SubmissionThread = nullptr; FCriticalSection InterruptCS; FVulkanThread* InterruptThread = nullptr; VulkanRHI::FSemaphore* CPUTimelineSemaphore = nullptr; // used to wake up interrupt thread from CPU std::atomic CPUTimelineSemaphoreValue = 1; TQueue PendingPayloadsForSubmission; TMap SignaledSemaphores; FGraphEventRef EopTask; uint32 ApiVersion = 0; VkInstance Instance; TArray InstanceExtensions; TArray InstanceLayers; FVulkanDevice* Device; /** A list of all viewport RHIs that have been created. */ TArray Viewports; /** The viewport which is currently being drawn. */ TRefCountPtr DrawingViewport; void CreateInstance(); void SelectDevice(); friend class FVulkanCommandListContext; friend class FVulkanViewport; /* static void WriteEndFrameTimestamp(void*); */ TArray SetupInstanceLayers(FVulkanInstanceExtensionArray& UEExtensions); IConsoleObject* SavePipelineCacheCmd = nullptr; IConsoleObject* RebuildPipelineCacheCmd = nullptr; #if VULKAN_SUPPORTS_VALIDATION_CACHE IConsoleObject* SaveValidationCacheCmd = nullptr; #endif static void RebuildPipelineCache(); #if VULKAN_SUPPORTS_VALIDATION_CACHE static void SaveValidationCache(); #endif #if UE_BUILD_DEBUG || UE_BUILD_DEVELOPMENT IConsoleObject* DumpMemoryCmd = nullptr; IConsoleObject* DumpMemoryFullCmd = nullptr; IConsoleObject* DumpStagingMemoryCmd = nullptr; IConsoleObject* DumpLRUCmd = nullptr; IConsoleObject* TrimLRUCmd = nullptr; public: static void DumpMemory(); static void DumpMemoryFull(); static void DumpStagingMemory(); static void DumpLRU(); static void TrimLRU(); #endif public: enum class EActiveDebugLayerExtension { None, GfxReconstructLayer, VkTraceLayer, DebugUtilsExtension }; protected: bool bIsStandaloneStereoDevice = false; EActiveDebugLayerExtension ActiveDebugLayerExtension = EActiveDebugLayerExtension::None; #if VULKAN_HAS_DEBUGGING_ENABLED VkDebugUtilsMessengerEXT Messenger = VK_NULL_HANDLE; void SetupDebugLayerCallback(); void RemoveDebugLayerCallback(); #endif FCriticalSection LockBufferCS; void InternalUpdateTexture2D(FRHICommandListBase& RHICmdList, FRHITexture* TextureRHI, uint32 MipIndex, const struct FUpdateTextureRegion2D& UpdateRegion, uint32 SourcePitch, const uint8* SourceData); void InternalUpdateTexture3D(FRHICommandListBase& RHICmdList, FRHITexture* TextureRHI, uint32 MipIndex, const struct FUpdateTextureRegion3D& UpdateRegion, uint32 SourceRowPitch, uint32 SourceDepthPitch, const uint8* SourceData); void UpdateUniformBuffer(FRHICommandListBase& RHICmdList, FVulkanUniformBuffer* UniformBuffer, const void* Contents); static void SetupValidationRequests(); FOptionalVulkanInstanceExtensions OptionalInstanceExtensions; public: static TSharedPtr< IHeadMountedDisplayVulkanExtensions, ESPMode::ThreadSafe > HMDVulkanExtensions; }; PRAGMA_ENABLE_DEPRECATION_WARNINGS /** Implements the Vulkan module as a dynamic RHI providing module. */ class FVulkanDynamicRHIModule : public IDynamicRHIModule { public: // IModuleInterface virtual void StartupModule() override; // IDynamicRHIModule virtual bool IsSupported() override; virtual bool IsSupported(ERHIFeatureLevel::Type RequestedFeatureLevel) override; virtual FDynamicRHI* CreateRHI(ERHIFeatureLevel::Type RequestedFeatureLevel = ERHIFeatureLevel::Num) override; };