void GuardianSystemDemo::InitRenderTargets(const ovrHmdDesc& hmdDesc) { // For each eye for (int i = 0; i < ovrEye_Count; ++i) { // Viewport const float kPixelsPerDisplayPixel = 1.0f; ovrSizei idealSize = ovr_GetFovTextureSize(mSession, (ovrEyeType)i, hmdDesc.DefaultEyeFov[i], kPixelsPerDisplayPixel); mEyeRenderViewport[i] = { 0, 0, idealSize.w, idealSize.h }; // Create Swap Chain ovrTextureSwapChainDesc desc = { ovrTexture_2D, OVR_FORMAT_R8G8B8A8_UNORM_SRGB, 1, idealSize.w, idealSize.h, 1, 1, ovrFalse, ovrTextureMisc_DX_Typeless, ovrTextureBind_DX_RenderTarget }; // Configure Eye render layers mEyeRenderLayer.Header.Type = ovrLayerType_EyeFov; mEyeRenderLayer.Viewport[i] = mEyeRenderViewport[i]; mEyeRenderLayer.Fov[i] = hmdDesc.DefaultEyeFov[i]; mHmdToEyeOffset[i] = ovr_GetRenderDesc(mSession, (ovrEyeType)i, hmdDesc.DefaultEyeFov[i]).HmdToEyeOffset; // DirectX 11 - Generate RenderTargetView from textures in swap chain // ---------------------------------------------------------------------- ovrResult result = ovr_CreateTextureSwapChainDX(mSession, DIRECTX.Device, &desc, &mTextureChain[i]); if (!OVR_SUCCESS(result)) { printf("ovr_CreateTextureSwapChainDX failed"); exit(-1); } // Render Target, normally triple-buffered int textureCount = 0; ovr_GetTextureSwapChainLength(mSession, mTextureChain[i], &textureCount); for (int j = 0; j < textureCount; ++j) { ID3D11Texture2D* renderTexture = nullptr; ovr_GetTextureSwapChainBufferDX(mSession, mTextureChain[i], j, IID_PPV_ARGS(&renderTexture)); D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc = { DXGI_FORMAT_R8G8B8A8_UNORM, D3D11_RTV_DIMENSION_TEXTURE2D }; ID3D11RenderTargetView* renderTargetView = nullptr; DIRECTX.Device->CreateRenderTargetView(renderTexture, &renderTargetViewDesc, &renderTargetView); mEyeRenderTargets[i].push_back(renderTargetView); renderTexture->Release(); } // DirectX 11 - Generate Depth // ---------------------------------------------------------------------- D3D11_TEXTURE2D_DESC depthTextureDesc = { (UINT)idealSize.w, (UINT)idealSize.h, 1, 1, DXGI_FORMAT_D32_FLOAT, {1, 0}, D3D11_USAGE_DEFAULT, D3D11_BIND_DEPTH_STENCIL, 0, 0 }; ID3D11Texture2D* depthTexture = nullptr; DIRECTX.Device->CreateTexture2D(&depthTextureDesc, NULL, &depthTexture); DIRECTX.Device->CreateDepthStencilView(depthTexture, NULL, &mEyeDepthTarget[i]); depthTexture->Release(); } }
bool Init(ovrSession session, int sizeW, int sizeH, bool createDepth) { Session = session; ovrTextureSwapChainDesc desc = {}; desc.Type = ovrTexture_2D; desc.ArraySize = 1; desc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB; desc.Width = sizeW; desc.Height = sizeH; desc.MipLevels = 1; desc.SampleCount = 1; desc.MiscFlags = ovrTextureMisc_DX_Typeless; desc.StaticImage = ovrFalse; desc.BindFlags = ovrTextureBind_DX_RenderTarget; ovrResult result = ovr_CreateTextureSwapChainDX(session, DIRECTX.CommandQueue, &desc, &TextureChain); if (!OVR_SUCCESS(result)) return false; int textureCount = 0; ovr_GetTextureSwapChainLength(Session, TextureChain, &textureCount); TexRtv.resize(textureCount); TexResource.resize(textureCount); for (int i = 0; i < textureCount; ++i) { result = ovr_GetTextureSwapChainBufferDX(Session, TextureChain, i, IID_PPV_ARGS(&TexResource[i])); if (!OVR_SUCCESS(result)) return false; D3D12_RENDER_TARGET_VIEW_DESC rtvd = {}; rtvd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; rtvd.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; TexRtv[i] = DIRECTX.RtvHandleProvider.AllocCpuHandle(); DIRECTX.Device->CreateRenderTargetView(TexResource[i], &rtvd, TexRtv[i]); } if (createDepth) { DepthTex.resize(textureCount); DepthTexDsv.resize(textureCount); for (int i = 0; i < textureCount; i++) { DepthTexDsv[i] = DIRECTX.DsvHandleProvider.AllocCpuHandle(); DepthTex[i] = new DepthBuffer(DIRECTX.Device, DepthTexDsv[i], sizeW, sizeH); } } return true; }
DLL_EXPORT_API xnOvrQuadLayer* xnOvrCreateQuadLayerTexturesDx(xnOvrSession* session, void* dxDevice, int* outTextureCount, int width, int height, int mipLevels, int sampleCount) { auto layer = new xnOvrQuadLayer; ovrTextureSwapChainDesc texDesc = {}; texDesc.Type = ovrTexture_2D; texDesc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB; texDesc.ArraySize = 1; texDesc.Width = width; texDesc.Height = height; texDesc.MipLevels = mipLevels; texDesc.SampleCount = sampleCount; texDesc.StaticImage = ovrFalse; texDesc.MiscFlags = ovrTextureMisc_None; texDesc.BindFlags = ovrTextureBind_DX_RenderTarget; if (!OVR_SUCCESS(ovr_CreateTextureSwapChainDX(session->Session, dxDevice, &texDesc, &layer->SwapChain))) { delete layer; return NULL; } auto count = 0; ovr_GetTextureSwapChainLength(session->Session, layer->SwapChain, &count); *outTextureCount = count; layer->Layer.Header.Type = ovrLayerType_Quad; layer->Layer.Header.Flags = ovrLayerFlag_HighQuality; layer->Layer.ColorTexture = layer->SwapChain; layer->Layer.Viewport.Pos.x = 0; layer->Layer.Viewport.Pos.y = 0; layer->Layer.Viewport.Size.w = width; layer->Layer.Viewport.Size.h = height; layer->Layer.QuadPoseCenter.Orientation.x = 0; layer->Layer.QuadPoseCenter.Orientation.y = 0; layer->Layer.QuadPoseCenter.Orientation.z = 0; layer->Layer.QuadPoseCenter.Orientation.w = 1; layer->Layer.QuadPoseCenter.Position.x = 0; layer->Layer.QuadPoseCenter.Position.y = 0; layer->Layer.QuadPoseCenter.Position.z = -1; layer->Layer.QuadSize.x = 2; layer->Layer.QuadSize.y = 2; return layer; }
bool Init(ovrSession session, int sizeW, int sizeH) { Session = session; ovrTextureSwapChainDesc desc = {}; desc.Type = ovrTexture_2D; desc.ArraySize = 1; desc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB; desc.Width = sizeW; desc.Height = sizeH; desc.MipLevels = 1; desc.SampleCount = 1; desc.MiscFlags = ovrTextureMisc_DX_Typeless; desc.StaticImage = ovrFalse; desc.BindFlags = ovrTextureBind_DX_RenderTarget; ovrResult result = ovr_CreateTextureSwapChainDX(session, DIRECTX.Device, &desc, &TextureChain); if (!OVR_SUCCESS(result)) return false; int textureCount = 0; ovr_GetTextureSwapChainLength(Session, TextureChain, &textureCount); VALIDATE(textureCount == TextureCount, "TextureCount mismatch."); for (int i = 0; i < TextureCount; ++i) { ID3D11Texture2D* tex = nullptr; ovr_GetTextureSwapChainBufferDX(Session, TextureChain, i, IID_PPV_ARGS(&tex)); D3D11_RENDER_TARGET_VIEW_DESC rtvd = {}; rtvd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; rtvd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; DIRECTX.Device->CreateRenderTargetView(tex, &rtvd, &TexRtv[i]); tex->Release(); } return true; }
void VR::initD3D() { #if defined(_OVR_) Sizei bufferSize; bufferSize.w = buffersize_width; bufferSize.h = buffersize_height; // xapp->d3d11Device.Get() will not work, we need a real D3D11 device //for (int i = 0; i < xapp->FrameCount; i++) { // ID3D12Resource *resource = xapp->renderTargets[i].Get(); // D3D12_RESOURCE_DESC rDesc = resource->GetDesc(); // D3D11_RESOURCE_FLAGS d3d11Flags = { D3D11_BIND_RENDER_TARGET }; // ThrowIfFailed(xapp->d3d11On12Device->CreateWrappedResource( // resource, // &d3d11Flags, // D3D12_RESOURCE_STATE_RENDER_TARGET, // D3D12_RESOURCE_STATE_PRESENT, // IID_PPV_ARGS(&xapp->wrappedBackBuffers[i]) // )); // //xapp->d3d11On12Device->AcquireWrappedResources(xapp->wrappedBackBuffers[i].GetAddressOf(), 1); //} ovrTextureSwapChainDesc dsDesc = {}; dsDesc.Type = ovrTexture_2D; dsDesc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB; dsDesc.ArraySize = 1; dsDesc.Width = bufferSize.w; dsDesc.Height = bufferSize.h; dsDesc.MipLevels = 1; dsDesc.SampleCount = 1; dsDesc.StaticImage = ovrFalse; dsDesc.MiscFlags = ovrTextureMisc_DX_Typeless;//ovrTextureMisc_None; dsDesc.BindFlags = ovrTextureBind_DX_RenderTarget; /* D3D11_TEXTURE2D_DESC dsDesc; dsDesc.Width = bufferSize.w; dsDesc.Height = bufferSize.h; dsDesc.MipLevels = 1; dsDesc.ArraySize = 1; dsDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;//DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; dsDesc.SampleDesc.Count = 1; dsDesc.SampleDesc.Quality = 0; dsDesc.Usage = D3D11_USAGE_DEFAULT; dsDesc.CPUAccessFlags = 0; dsDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; dsDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; */ if (ovr_CreateTextureSwapChainDX(session, xapp->commandQueue.Get()/*xapp->reald3d11Device.Get()*/, &dsDesc, &textureSwapChain) == ovrSuccess) { int count = 0; ovr_GetTextureSwapChainLength(session, textureSwapChain, &count); texRtv.resize(count); texResource.resize(count); // Create descriptor heaps. UINT rtvDescriptorSize; { // Describe and create a render target view (RTV) descriptor heap. D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {}; rtvHeapDesc.NumDescriptors = count; rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; ThrowIfFailed(xapp->device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&rtvVRHeap))); rtvVRHeap->SetName(L"rtVRHeap_xapp"); rtvDescriptorSize = xapp->device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); } for (int i = 0; i < count; ++i) { ID3D11Texture2D* tex = nullptr; ovr_GetTextureSwapChainBufferDX(session, textureSwapChain, i, IID_PPV_ARGS(&texResource[i])); //xapp->reald3d11Device.Get()->CreateRenderTargetView(tex, nullptr, &texRtv[i]); D3D12_RENDER_TARGET_VIEW_DESC rtvd = {}; rtvd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; rtvd.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(rtvVRHeap->GetCPUDescriptorHandleForHeapStart(), i, rtvDescriptorSize); texRtv[i] = rtvHandle; xapp->device->CreateRenderTargetView(texResource[i], /*nullptr*/&rtvd, texRtv[i]); //ComPtr<IDXGIResource> dxgires; //tex->QueryInterface<IDXGIResource>(&dxgires); ////Log("dxgires = " << dxgires.GetAddressOf() << endl); //HANDLE shHandle; //dxgires->GetSharedHandle(&shHandle); ////Log("shared handle = " << shHandle << endl); //xapp->d3d11Device->OpenSharedResource(shHandle, IID_PPV_ARGS(&xapp->wrappedTextures[i])); //tex->Release(); } } // Initialize our single full screen Fov layer. layer.Header.Type = ovrLayerType_EyeFov; layer.Header.Flags = 0; layer.ColorTexture[0] = textureSwapChain; layer.ColorTexture[1] = nullptr;//textureSwapChain; layer.Fov[0] = eyeRenderDesc[0].Fov; layer.Fov[1] = eyeRenderDesc[1].Fov; layer.Viewport[0] = Recti(0, 0, bufferSize.w / 2, bufferSize.h); layer.Viewport[1] = Recti(bufferSize.w / 2, 0, bufferSize.w / 2, bufferSize.h); // ld.RenderPose and ld.SensorSampleTime are updated later per frame. #endif #if defined(_DEBUG) // SetStablePowerState requires Win10 to be in developer mode: // start settings app, then search for 'for developers settings', // then enable it under developer features, developer mode //xapp->device->SetStablePowerState(true); #endif }
DLL_EXPORT_API npBool xnOvrCreateTexturesDx(xnOvrSession* session, void* dxDevice, int* outTextureCount, float pixelPerDisplayPixel, int mirrorBufferWidth, int mirrorBufferHeight) { session->HmdDesc = ovr_GetHmdDesc(session->Session); ovrSizei sizel = ovr_GetFovTextureSize(session->Session, ovrEye_Left, session->HmdDesc.DefaultEyeFov[0], pixelPerDisplayPixel); ovrSizei sizer = ovr_GetFovTextureSize(session->Session, ovrEye_Right, session->HmdDesc.DefaultEyeFov[1], pixelPerDisplayPixel); ovrSizei bufferSize; bufferSize.w = sizel.w + sizer.w; bufferSize.h = fmax(sizel.h, sizer.h); ovrTextureSwapChainDesc texDesc = {}; texDesc.Type = ovrTexture_2D; texDesc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB; texDesc.ArraySize = 1; texDesc.Width = bufferSize.w; texDesc.Height = bufferSize.h; texDesc.MipLevels = 1; texDesc.SampleCount = 1; texDesc.StaticImage = ovrFalse; texDesc.MiscFlags = ovrTextureMisc_None; texDesc.BindFlags = ovrTextureBind_DX_RenderTarget; if(!OVR_SUCCESS(ovr_CreateTextureSwapChainDX(session->Session, dxDevice, &texDesc, &session->SwapChain))) { return false; } auto count = 0; ovr_GetTextureSwapChainLength(session->Session, session->SwapChain, &count); *outTextureCount = count; //init structures session->EyeRenderDesc[0] = ovr_GetRenderDesc(session->Session, ovrEye_Left, session->HmdDesc.DefaultEyeFov[0]); session->EyeRenderDesc[1] = ovr_GetRenderDesc(session->Session, ovrEye_Right, session->HmdDesc.DefaultEyeFov[1]); session->HmdToEyeViewOffset[0] = session->EyeRenderDesc[0].HmdToEyeOffset; session->HmdToEyeViewOffset[1] = session->EyeRenderDesc[1].HmdToEyeOffset; session->Layer.Header.Type = ovrLayerType_EyeFov; session->Layer.Header.Flags = 0; session->Layer.ColorTexture[0] = session->SwapChain; session->Layer.ColorTexture[1] = session->SwapChain; session->Layer.Fov[0] = session->EyeRenderDesc[0].Fov; session->Layer.Fov[1] = session->EyeRenderDesc[1].Fov; session->Layer.Viewport[0].Pos.x = 0; session->Layer.Viewport[0].Pos.y = 0; session->Layer.Viewport[0].Size.w = bufferSize.w / 2; session->Layer.Viewport[0].Size.h = bufferSize.h; session->Layer.Viewport[1].Pos.x = bufferSize.w / 2; session->Layer.Viewport[1].Pos.y = 0; session->Layer.Viewport[1].Size.w = bufferSize.w / 2; session->Layer.Viewport[1].Size.h = bufferSize.h; //create mirror as well if (mirrorBufferHeight != 0 && mirrorBufferWidth != 0) { ovrMirrorTextureDesc mirrorDesc = {}; mirrorDesc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB; mirrorDesc.Width = mirrorBufferWidth; mirrorDesc.Height = mirrorBufferHeight; if (!OVR_SUCCESS(ovr_CreateMirrorTextureDX(session->Session, dxDevice, &mirrorDesc, &session->Mirror))) { return false; } } return true; }