bool FOculusRiftHMD::D3D11Bridge::IsUsingGraphicsAdapter(const ovrGraphicsLuid& luid) { TRefCountPtr<ID3D11Device> D3D11Device; ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER( GetNativeDevice, TRefCountPtr<ID3D11Device>&, D3D11DeviceRef, D3D11Device, { D3D11DeviceRef = (ID3D11Device*) RHIGetNativeDevice(); });
void FSteamVRHMD::D3D11Bridge::BeginRendering() { check(IsInRenderingThread()); static bool Inited = false; if (!Inited) { Plugin->VRCompositor->SetGraphicsDevice(vr::Compositor_DeviceType_D3D11, RHIGetNativeDevice()); Inited = true; } }
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; } }