You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
This represents UE4/Main @ 14768117 For ReleaseObjectVersion.h #lockdown Marcus.Wassmer [CL 14811440 by Marc Audy in ue5-main branch]
155 lines
4.8 KiB
C++
155 lines
4.8 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "TextureShareD3D11Client.h"
|
|
#include "TextureShareDLL.h"
|
|
|
|
#ifdef _DEBUG
|
|
#pragma comment( lib, "TextureShareSDK-Win64-Debug.lib" )
|
|
#else
|
|
#pragma comment( lib, "TextureShareSDK.lib" )
|
|
#endif
|
|
|
|
FTextureShareD3D11Client::FTextureShareD3D11Client(ID3D11Device* InD3DDevice)
|
|
: pD3D11Device(InD3DDevice)
|
|
{
|
|
}
|
|
|
|
FTextureShareD3D11Client::~FTextureShareD3D11Client()
|
|
{
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::CreateShare(std::wstring ShareName)
|
|
{
|
|
FTextureShareSyncPolicy DefaultSyncPolicy;
|
|
DefaultSyncPolicy.ConnectionSync = ETextureShareSyncConnect::None;
|
|
DefaultSyncPolicy.FrameSync = ETextureShareSyncFrame::None;
|
|
DefaultSyncPolicy.TextureSync = ETextureShareSyncSurface::None;
|
|
return FTextureShareInterface::CreateTextureShare(ShareName.c_str(), ETextureShareProcess::Client, DefaultSyncPolicy, ETextureShareDevice::D3D11);
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::DeleteShare(std::wstring ShareName)
|
|
{
|
|
return FTextureShareInterface::ReleaseTextureShare(ShareName.c_str());
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::BeginSession(std::wstring ShareName)
|
|
{
|
|
return FTextureShareInterface::BeginSession(ShareName.c_str());
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::EndSession(std::wstring ShareName)
|
|
{
|
|
return FTextureShareInterface::EndSession(ShareName.c_str());
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::BeginFrame_RenderThread(std::wstring ShareName)
|
|
{
|
|
return FTextureShareInterface::BeginFrame_RenderThread(ShareName.c_str());
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::EndFrame_RenderThread(std::wstring ShareName)
|
|
{
|
|
return FTextureShareInterface::EndFrame_RenderThread(ShareName.c_str());
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::IsRemoteTextureUsed(std::wstring ShareName, std::wstring TextureName)
|
|
{
|
|
return FTextureShareInterface::IsRemoteTextureUsed(ShareName.c_str(), TextureName.c_str());
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::RegisterTexture(std::wstring ShareName, std::wstring TextureName, ETextureShareSurfaceOp TextureOp, uint32 Width, uint32 Height, DXGI_FORMAT InFormat)
|
|
{
|
|
ETextureShareFormat ShareFormat = ETextureShareFormat::Undefined;
|
|
uint32 ShareFormatValue = 0;
|
|
|
|
// Use client texture format:
|
|
if (InFormat != DXGI_FORMAT_UNKNOWN)
|
|
{
|
|
ShareFormat = ETextureShareFormat::Format_DXGI;
|
|
ShareFormatValue = InFormat;
|
|
}
|
|
|
|
return FTextureShareInterface::RegisterTexture(ShareName.c_str(), TextureName.c_str(), Width, Height, ShareFormat, ShareFormatValue, TextureOp);
|
|
}
|
|
|
|
void ReleaseTextureAndSRV(ID3D11Texture2D** OutTexture, ID3D11ShaderResourceView** TextureSRV)
|
|
{
|
|
if (*TextureSRV)
|
|
{
|
|
(*TextureSRV)->Release();
|
|
*TextureSRV = nullptr;
|
|
}
|
|
if (*OutTexture)
|
|
{
|
|
(*OutTexture)->Release();
|
|
*OutTexture = nullptr;
|
|
}
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::ReadAdditionalData(std::wstring ShareName, FTextureShareSDKAdditionalData* OutFrameData)
|
|
{
|
|
return FTextureShareInterface::GetRemoteAdditionalData(ShareName.c_str(), *OutFrameData);
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::ReadTextureFrame_RenderThread(std::wstring ShareName, std::wstring TextureName, ID3D11Texture2D** InOutTexture, ID3D11ShaderResourceView** InOutTextureSRV)
|
|
{
|
|
bool bResult = false;
|
|
|
|
if (FTextureShareInterface::IsValid(ShareName.c_str()))
|
|
{
|
|
ID3D11Texture2D* SharedResource;
|
|
if (FTextureShareInterface::LockTextureD3D11_RenderThread(pD3D11Device, ShareName.c_str(), TextureName.c_str(), SharedResource))
|
|
{
|
|
|
|
if (!FTextureShareD3D11Helper::IsTexturesEqual(SharedResource, *InOutTexture))
|
|
{
|
|
// Shared texture size changed on server side,
|
|
// Remove temp texture, and re-create new tempTexture
|
|
ReleaseTextureAndSRV(InOutTexture, InOutTextureSRV);
|
|
}
|
|
|
|
if (!*InOutTexture)
|
|
{
|
|
// Create new temp texture&srv
|
|
if (!FTextureShareD3D11Helper::CreateSRVTexture(pD3D11Device, SharedResource, InOutTexture, InOutTextureSRV))
|
|
{
|
|
ReleaseTextureAndSRV(InOutTexture, InOutTextureSRV);
|
|
}
|
|
}
|
|
|
|
// Copy from shared to temp:
|
|
if (*InOutTexture)
|
|
{
|
|
bResult = true;
|
|
FTextureShareD3D11Helper::CopyResource(pD3D11Device, SharedResource, *InOutTexture);
|
|
}
|
|
|
|
// Unlock shared resource
|
|
FTextureShareInterface::UnlockTexture_RenderThread(ShareName.c_str(), TextureName.c_str());
|
|
}
|
|
else
|
|
{
|
|
// Release unused texture (disconnect purpose)
|
|
ReleaseTextureAndSRV(InOutTexture, InOutTextureSRV);
|
|
}
|
|
}
|
|
return bResult;
|
|
}
|
|
|
|
bool FTextureShareD3D11Client::WriteTextureFrame_RenderThread(std::wstring ShareName, std::wstring TextureName, ID3D11Texture2D* InTexture)
|
|
{
|
|
if (FTextureShareInterface::IsValid(ShareName.c_str()))
|
|
{
|
|
ID3D11Texture2D* SharedResource;
|
|
if (FTextureShareInterface::LockTextureD3D11_RenderThread(pD3D11Device, ShareName.c_str(), TextureName.c_str(), SharedResource))
|
|
{
|
|
// Copy backbuffer to shared texture
|
|
FTextureShareD3D11Helper::CopyResource(pD3D11Device, InTexture, SharedResource);
|
|
FTextureShareInterface::UnlockTexture_RenderThread(ShareName.c_str(), TextureName.c_str());
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|