diff --git a/Source/DisplayCluster/Private/DisplayClusterConstants.h b/Source/DisplayCluster/Private/DisplayClusterConstants.h index abc132245985dec89e99e8dc110b0b55546a9b66..6a10c4bfc2097af9a5d12fea919b93b0caf1d97b 100644 --- a/Source/DisplayCluster/Private/DisplayClusterConstants.h +++ b/Source/DisplayCluster/Private/DisplayClusterConstants.h @@ -12,8 +12,8 @@ namespace DisplayClusterConstants { static constexpr int32 ClientConnectTriesAmount = 100; // times static constexpr float ClientConnectRetryDelay = 1.0f; // sec - static constexpr uint32 BarrierGameStartWaitTimeout = 80000; // ms - static constexpr uint32 BarrierWaitTimeout = 10000; // ms + static constexpr uint32 BarrierGameStartWaitTimeout = 90000; // ms + static constexpr uint32 BarrierWaitTimeout = 30000; // ms static constexpr int32 SocketBufferSize = INT16_MAX; // bytes static constexpr int32 MessageBufferSize = INT16_MAX; // bytes }; diff --git a/Source/DisplayCluster/Private/Render/Devices/Monoscopic/DisplayClusterDeviceMonoscopicOpenGL.cpp b/Source/DisplayCluster/Private/Render/Devices/Monoscopic/DisplayClusterDeviceMonoscopicOpenGL.cpp index 238d5634dffb98e6843be9ec80d748b484cd4baf..0b35d20927ab0ba2db4b84df0f1a7a565674bdb7 100644 --- a/Source/DisplayCluster/Private/Render/Devices/Monoscopic/DisplayClusterDeviceMonoscopicOpenGL.cpp +++ b/Source/DisplayCluster/Private/Render/Devices/Monoscopic/DisplayClusterDeviceMonoscopicOpenGL.cpp @@ -51,9 +51,8 @@ bool FDisplayClusterDeviceMonoscopicOpenGL::Present(int32& InOutSyncInterval) { UE_LOG(LogDisplayClusterRender, Verbose, TEXT("FDisplayClusterDeviceQuadBufferStereoOpenGL::Present")); - const int halfSizeX = BackBuffSize.X / 2; const int dstX1 = 0; - const int dstX2 = halfSizeX; + const int dstX2 = BackBuffSize.X; // Convert to left bottom origin and flip Y const int dstY1 = ViewportSize.Y; @@ -76,7 +75,7 @@ bool FDisplayClusterDeviceMonoscopicOpenGL::Present(int32& InOutSyncInterval) glReadBuffer(GL_COLOR_ATTACHMENT0); glBlitFramebuffer( - 0, 0, halfSizeX, BackBuffSize.Y, + 0, 0, BackBuffSize.X, BackBuffSize.Y, dstX1, dstY1, dstX2, dstY2, GL_COLOR_BUFFER_BIT, GL_NEAREST); diff --git a/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.cpp b/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.cpp index 663544d184dafd7c29c5160c7afc0b882f8c3464..2b3567417861ba6391c7dfbc0832f346f1ed2434 100644 --- a/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.cpp +++ b/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.cpp @@ -23,6 +23,11 @@ FDisplayClusterDeviceQuadBufferStereoOpenGL::~FDisplayClusterDeviceQuadBufferSte { } +bool FDisplayClusterDeviceQuadBufferStereoOpenGL::ShouldUseSeparateRenderTarget() const +{ + return true; +} + void FDisplayClusterDeviceQuadBufferStereoOpenGL::SetSwapSyncPolicy(EDisplayClusterSwapSyncPolicy policy) { FScopeLock lock(&InternalsSyncScope); @@ -99,11 +104,52 @@ bool FDisplayClusterDeviceQuadBufferStereoOpenGL::Present(int32& InOutSyncInterv // Linux implementation ////////////////////////////////////////////////////////////////////////////////////////////// #if PLATFORM_LINUX -//@todo: Implementation for Linux bool FDisplayClusterDeviceQuadBufferStereoOpenGL::Present(int32& InOutSyncInterval) { - // Forward to default implementation (should be a black screen) - return FDisplayClusterDeviceBase::Present(InOutSyncInterval); + UE_LOG(LogDisplayClusterRender, Verbose, TEXT("FDisplayClusterDeviceQuadBufferStereoOpenGL::Present")); + + const int halfSizeX = BackBuffSize.X / 2; + const int dstX1 = 0; + const int dstX2 = halfSizeX; + + // Convert to left bottom origin and flip Y + const int dstY1 = ViewportSize.Y; + const int dstY2 = 0; + + FOpenGLViewport* pOglViewport = static_cast<FOpenGLViewport*>(CurrentViewport->GetViewportRHI().GetReference()); + check(pOglViewport); + FPlatformOpenGLContext* const pContext = pOglViewport->GetGLContext(); + check(pContext); + + const FTexture2DRHIRef& renderTargetTexture = CurrentViewport->GetRenderTargetTexture(); + check(IsValidRef(renderTargetTexture)); + GLuint nativeRenderTargetTexture = *reinterpret_cast<GLuint*>(renderTargetTexture->GetNativeResource()); + glFramebufferTexture(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, nativeRenderTargetTexture, 0); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, pContext->ViewportFramebuffer); + glReadBuffer(GL_COLOR_ATTACHMENT0); + + glDrawBuffer(GL_BACK_LEFT); + glBlitFramebuffer( + 0, 0, halfSizeX, BackBuffSize.Y, + dstX1, dstY1, dstX2, dstY2, + GL_COLOR_BUFFER_BIT, + GL_NEAREST); + + glDrawBuffer(GL_BACK_RIGHT); + glBlitFramebuffer( + halfSizeX, 0, BackBuffSize.X, BackBuffSize.Y, + dstX1, dstY1, dstX2, dstY2, + GL_COLOR_BUFFER_BIT, + GL_NEAREST); + + // Perform buffers swap logic + SwapBuffers(pOglViewport, InOutSyncInterval); + REPORT_GL_END_BUFFER_EVENT_FOR_FRAME_DUMP(); + + return false; } #endif diff --git a/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.h b/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.h index f9c9157403b718c5ead082834ce26f4d01f2f68a..f40383af966e2caf2146b79435b76b716c36687f 100644 --- a/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.h +++ b/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.h @@ -16,6 +16,7 @@ public: virtual ~FDisplayClusterDeviceQuadBufferStereoOpenGL(); protected: + virtual bool ShouldUseSeparateRenderTarget() const override; virtual void SetSwapSyncPolicy(EDisplayClusterSwapSyncPolicy policy); virtual bool Present(int32& InOutSyncInterval) override; void SwapBuffers(FOpenGLViewport* pOglViewport, int32& InOutSyncInterval);