// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Containers/TextureShareSDKContainers.h" #include "Containers/TextureShareCoreContainers.h" #include "Serialize/TextureShareSDKDataWrappers.h" /** * TextureShareSDK object API */ class TEXTURESHARESDK_API ITextureShareSDKObject { public: virtual ~ITextureShareSDKObject() = default; public: ///////////////////////// State ///////////////////////// /** * Return the name of the TextureShare. */ virtual const wchar_t* GetName() const = 0; /** * Returns detailed information about the TextureShare object. */ virtual void GetObjectDesc(TDataOutput& OutObjectDesc) const = 0; /** * Returns detailed information about the TextureShare proxy object. */ virtual void GetObjectDesc_RenderThread(TDataOutput& OutObjectDesc) const = 0; /** * Returns true if the TextureShare object is ready to be used. */ virtual bool IsActive() const = 0; /** * Returns true if the TextureShare object proxy is ready to be used. */ virtual bool IsActive_RenderThread() const = 0; /** * Returns true if the TextureShareCore object has started a session and processes are connected for this frame. */ virtual bool IsFrameSyncActive() const = 0; /** * Returns true if the TextureShareCore object proxy has started a session and processes are connected for this frame. */ virtual bool IsFrameSyncActive_RenderThread() const = 0; /** * Support for multi-threaded implementation. * Returns true if the BeginFrameSync() function can be called at this moment for object */ virtual bool IsBeginFrameSyncActive() const = 0; /** * Support for multi-threaded implementation. * Returns true if the BeginFrameSync() function can be called at this moment for object proxy */ virtual bool IsBeginFrameSyncActive_RenderThread() const = 0; public: ///////////////////////// Settings ///////////////////////// /** * Change the process name for this TextureShare object. * If the object is synced now, then the changes are deferred and executed in the next frame. * * @param InProcessId - New process name * * @return true, if success */ virtual bool SetProcessId(const wchar_t* InProcessId) = 0; /** * Assign a device type for this TextureShare object. * * @param InDeviceType - render device type */ virtual bool SetDeviceType(const ETextureShareDeviceType InDeviceType) = 0; /** * Change the sync settings for this TextureShare object. * If the object is synced now, then the changes are deferred and executed in the next frame. * * @param InSyncSetting - New sync settings * * @return true, if success */ virtual bool SetSyncSetting(const TDataInput& InSyncSetting) = 0; /** * Return the sync settings of the TextureShare. */ virtual void GetSyncSetting(TDataOutput& OutSyncSettings) const = 0; /** * Get TextureShare default sync settings by template type * The settings of this template are not related to the current settings of the object * * @param InType - Sync settings template type * * @return structure with sync logic settings */ virtual void GetFrameSyncSettings(const ETextureShareFrameSyncTemplate InType, TDataOutput& OutFrameSyncSettings) const = 0; /** * Find skipped frame sync step * * @param InSyncStep - Sync step value * @param OutSkippedSyncStep - Skipped sync step value * * @return true, if skipped sync step found */ virtual bool FindSkippedSyncStep(const ETextureShareSyncStep InSyncStep, ETextureShareSyncStep& OutSkippedSyncStep) const = 0; /** * Find skipped frame sync step for proxy object * * @param InSyncStep - Sync step value * @param OutSkippedSyncStep - Skipped sync step value * * @return true, if skipped sync step found */ virtual bool FindSkippedSyncStep_RenderThread(const ETextureShareSyncStep InSyncStep, ETextureShareSyncStep& OutSkippedSyncStep) const = 0; public: ///////////////////////// Session ///////////////////////// /** * Start a TextureShare session for the specified device * * @param InDeviceType - Shared resources render device type * * @return True if the success */ virtual bool BeginSession() = 0; /** * End the TextureShare session and the resources in use are also removed. * * @return True if the success */ virtual bool EndSession() = 0; /** * Returns true if the session is currently valid */ virtual bool IsSessionActive() const = 0; public: ///////////////////////// Thread sync support ///////////////////////// /** * Support for multi-threaded implementation. * The mutex of the specified type will be locked (and created for the first time) * * @param InThreadMutex - Mutex type * @param bForceLockNoWait - lock without waiting for unlock * * @return True if the success */ virtual bool LockThreadMutex(const ETextureShareThreadMutex InThreadMutex, bool bForceLockNoWait = false) = 0; /** * Support for multi-threaded implementation. * The mutex of the specified type will be unlocked * * @param InThreadMutex - Mutex type * * @return True if the success */ virtual bool UnlockThreadMutex(const ETextureShareThreadMutex InThreadMutex) = 0; public: ///////////////////////// Interprocess Synchronization ///////////////////////// /** * Begin sync logic in range FrameBegin..FrameEnd * The list of connected processes for the current frame will also be updated. * Returns true if the frame is connected to other processes that match the synchronization settings. */ virtual bool BeginFrameSync() = 0; /** * Synchronize connected processes that support this sync step * Data from remote processes will be read at the time the barrier is synchronized. * Missed sync steps from the sync settings will also be called. * * @param InSyncStep - Sync step value * * @return True if the success */ virtual bool FrameSync(const ETextureShareSyncStep InSyncStep) = 0; /** * Finalize sync logic in range FrameBegin..FrameEnd * Missed sync steps from the sync settings will also be called. */ virtual bool EndFrameSync() = 0; /** * Begin sync logic in range FrameProxyBegin..FrameProxyEnd */ virtual bool BeginFrameSync_RenderThread() = 0; /** * Synchronize connected processes that support this sync step * ProxyData from remote processes will be read at the time the barrier is synchronized. * Missed sync steps from the sync settings will also be called. * * @param InSyncStep - Sync step value * * @return True if the success */ virtual bool FrameSync_RenderThread(const ETextureShareSyncStep InSyncStep) = 0; /** * Finalize sync logic in range FrameProxyBegin..FrameProxyEnd * Missed sync steps from the sync settings will also be called. */ virtual bool EndFrameSync_RenderThread() = 0; /** * Returns a list of handles to the interprocess TextureShare objects that are currently connected to this object. * * @param OutInterprocessObjects - Output array with handles to TextureShare objects * * @return true, if success */ virtual void GetConnectedInterprocessObjects(TDataOutput>& OutObjectList) const = 0; public: ///////////////////////// Data Containers ///////////////////////// /** * Get object data * Object data for the current frame in the GameThread. */ virtual void GetData(TDataOutput& OutObjectData) = 0; /** * Set object data * Set new object data for the current frame in the GameThread. */ virtual void SetData(const TDataInput& InObjectData) = 0; /** * Get object ProxyData. * Object proxy data for the current frame in the RenderThread. */ virtual void GetProxyData_RenderThread(TDataOutput& OutObjectProxyData) = 0; /** * Set object ProxyData. * Object proxy data for the current frame in the RenderThread. */ virtual void SetProxyData_RenderThread(const TDataInput& InObjectProxyData) = 0; /** * Received Data from connected process objects */ virtual void GetReceivedData(TDataOutput>& OutReceivedObjectsData) const = 0; /** * Received ProxyData from connected process objects */ virtual void GetReceivedProxyData_RenderThread(TDataOutput>& OutObjectsProxyData) const = 0; public: ///////////////////////// Access to shared resources ///////////////////////// /** * Open shared D3D11 resource * * @param InD3D11Device - D3D11 device interface * @param InResourceDesc- Shared resource descriptor * * @return pointer to shared D3D11 texture, or nullptr on failure */ virtual ID3D11Texture2D* OpenSharedResourceD3D11(ID3D11Device* InD3D11Device, const TDataInput& InResourceDesc) = 0; /** * Open shared D3D12 resource * * @param InD3D12Device - D3D12 device interface * @param InResourceDesc- Shared resource descriptor * * @return pointer to shared D3D12 texture, or nullptr on failure */ virtual ID3D12Resource* OpenSharedResourceD3D12(ID3D12Device* InD3D12Device, const TDataInput& InResourceDesc) = 0; /** * Open shared Vulkan resource * * @parama InDeviceVulkanContext - Vulkan device context * @param InResourceDesc - Shared resource descriptor * @param OutVulkanResource - Output Vulkan resource * * @return true, if resource opened */ virtual bool OpenSharedResourceVulkan(const TDataInput& InDeviceVulkanContext, const TDataInput& InResourceDesc, TDataOutput& OutVulkanResource) = 0; };