//============================================================================= void FSteamVRHMD::UpdateSplashScreen() { FTexture2DRHIRef Texture = (bSplashShowMovie && SplashMovie.IsValid()) ? SplashMovie : SplashTexture; if (bSplashIsShown && Texture.IsValid()) { FLayerDesc LayerDesc; LayerDesc.Flags = ELayerFlags::LAYER_FLAG_TEX_NO_ALPHA_CHANNEL; LayerDesc.PositionType = ELayerType::TrackerLocked; LayerDesc.Texture = Texture; LayerDesc.UVRect = FBox2D(SplashOffset, SplashScale); LayerDesc.Transform.SetTranslation(FVector(500.0f, 0.0f, 0.0f)); LayerDesc.QuadSize = FVector2D(800.0f, 450.0f); if (SplashLayerHandle) { SetLayerDesc(SplashLayerHandle, LayerDesc); } else { SplashLayerHandle = CreateLayer(LayerDesc); } } else { if (SplashLayerHandle) { DestroyLayer(SplashLayerHandle); SplashLayerHandle = 0; } } }
void FSceneViewport::SetRenderTargetTextureRenderThread(FTexture2DRHIRef& RT) { check(IsInRenderingThread()); RenderTargetTextureRenderThreadRHI = RT; if (RT.IsValid()) { RenderThreadSlateTexture->SetRHIRef(RenderTargetTextureRenderThreadRHI, RT->GetSizeX(), RT->GetSizeY()); } else { RenderThreadSlateTexture->SetRHIRef(nullptr, 0, 0); } }
void FOculusRiftHMD::D3D11Bridge::BeginRendering(FHMDViewExtension& InRenderContext, const FTexture2DRHIRef& RT) { check(IsInRenderingThread()); SetRenderContext(&InRenderContext); FGameFrame* CurrentFrame = GetRenderFrame(); check(CurrentFrame); FSettings* FrameSettings = CurrentFrame->GetSettings(); check(FrameSettings); const uint32 RTSizeX = RT->GetSizeX(); const uint32 RTSizeY = RT->GetSizeY(); const FVector2D ActualMirrorWindowSize = CurrentFrame->WindowSize; // detect if mirror texture needs to be re-allocated or freed if (Hmd && MirrorTextureRHI && (bNeedReAllocateMirrorTexture || Hmd != RenderContext->Hmd || (FrameSettings->Flags.bMirrorToWindow && ( FrameSettings->MirrorWindowMode != FSettings::eMirrorWindow_Distorted || ActualMirrorWindowSize != FVector2D(MirrorTextureRHI->GetSizeX(), MirrorTextureRHI->GetSizeY()))) || !FrameSettings->Flags.bMirrorToWindow )) { check(MirrorTexture); ovrHmd_DestroyMirrorTexture(Hmd, MirrorTexture); MirrorTexture = nullptr; MirrorTextureRHI = nullptr; bNeedReAllocateMirrorTexture = false; } // need to allocate a mirror texture? if (FrameSettings->Flags.bMirrorToWindow && FrameSettings->MirrorWindowMode == FSettings::eMirrorWindow_Distorted && !MirrorTextureRHI && ActualMirrorWindowSize.X != 0 && ActualMirrorWindowSize.Y != 0) { D3D11_TEXTURE2D_DESC dsDesc; dsDesc.Width = ActualMirrorWindowSize.X; dsDesc.Height = ActualMirrorWindowSize.Y; dsDesc.MipLevels = 1; dsDesc.ArraySize = 1; dsDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; dsDesc.SampleDesc.Count = 1; dsDesc.SampleDesc.Quality = 0; dsDesc.Usage = D3D11_USAGE_DEFAULT; dsDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; dsDesc.CPUAccessFlags = 0; dsDesc.MiscFlags = 0; ID3D11Device* D3DDevice = (ID3D11Device*)RHIGetNativeDevice(); ovrHmd_CreateMirrorTextureD3D11(Hmd, D3DDevice, &dsDesc, &MirrorTexture); if (!MirrorTexture) { UE_LOG(LogHMD, Error, TEXT("Can't create a mirror texture")); return; } UE_LOG(LogHMD, Log, TEXT("Allocated a new mirror texture (size %d x %d)"), ActualMirrorWindowSize.X, ActualMirrorWindowSize.Y); ovrD3D11Texture D3DMirrorTexture; D3DMirrorTexture.Texture = *MirrorTexture; MirrorTextureRHI = D3D11CreateTexture2DAlias( static_cast<FD3D11DynamicRHI*>(GDynamicRHI), D3DMirrorTexture.D3D11.pTexture, D3DMirrorTexture.D3D11.pSRView, dsDesc.Width, dsDesc.Height, 0, dsDesc.MipLevels, /*ActualMSAACount=*/ 1, (EPixelFormat)PF_B8G8R8A8, TexCreate_RenderTargetable); bNeedReAllocateMirrorTexture = false; } }