summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/renderer_d3d11.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d11.cpp')
-rw-r--r--3rdparty/bgfx/src/renderer_d3d11.cpp429
1 files changed, 230 insertions, 199 deletions
diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp
index 29b5d392511..8cccbcd6d5b 100644
--- a/3rdparty/bgfx/src/renderer_d3d11.cpp
+++ b/3rdparty/bgfx/src/renderer_d3d11.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2017 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
@@ -444,6 +444,17 @@ namespace bgfx { namespace d3d11
IID_IDXGIDevice0,
};
+ inline bool isLost(HRESULT _hr)
+ {
+ return false
+ || _hr == DXGI_ERROR_DEVICE_REMOVED
+ || _hr == DXGI_ERROR_DEVICE_HUNG
+ || _hr == DXGI_ERROR_DEVICE_RESET
+ || _hr == DXGI_ERROR_DRIVER_INTERNAL_ERROR
+ || _hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE
+ ;
+ }
+
template <typename Ty>
static BX_NO_INLINE void setDebugObjectName(Ty* _interface, const char* _format, ...)
{
@@ -614,17 +625,16 @@ namespace bgfx { namespace d3d11
virtual bool createSwapChain(const VRDesc& _desc, int _msaaSamples, int _mirrorWidth, int _mirrorHeight) BX_OVERRIDE;
virtual void destroySwapChain() BX_OVERRIDE;
virtual void destroyMirror() BX_OVERRIDE;
- virtual void renderEyeStart(const VRDesc& _desc, uint8_t _eye) BX_OVERRIDE;
+ virtual void makeRenderTargetActive(const VRDesc& _desc) BX_OVERRIDE;
virtual bool submitSwapChain(const VRDesc& _desc) BX_OVERRIDE;
private:
- ID3D11RenderTargetView* m_eyeRtv[2][4];
- ID3D11DepthStencilView* m_depthBuffer[2];
- ID3D11Texture2D* m_msaaTexture[2];
- ID3D11ShaderResourceView* m_msaaSv[2];
- ID3D11RenderTargetView* m_msaaRtv[2];
+ ID3D11DepthStencilView* m_depthBuffer;
+ ID3D11RenderTargetView* m_eyeRtv[4];
+ ID3D11RenderTargetView* m_msaaRtv;
+ ID3D11Texture2D* m_msaaTexture;
- ovrTextureSwapChain m_textureSwapChain[2];
+ ovrTextureSwapChain m_textureSwapChain;
ovrMirrorTexture m_mirrorTexture;
};
#endif // BGFX_CONFIG_USE_OVR
@@ -2075,7 +2085,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
uint32_t height = getBufferHeight();
FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
- setFrameBuffer(fbh, false);
+ setFrameBuffer(fbh, false, false);
D3D11_VIEWPORT vp;
vp.TopLeftX = 0;
@@ -2141,6 +2151,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
void preReset()
{
+ m_needPresent = false;
+
ovrPreReset();
if (m_timerQuerySupport)
@@ -2220,7 +2232,14 @@ BX_PRAGMA_DIAGNOSTIC_POP();
DX_RELEASE(depthStencil, 0);
}
- m_deviceCtx->OMSetRenderTargets(1, &m_backBufferColor, m_backBufferDepthStencil);
+ if (m_ovr.isEnabled() )
+ {
+ m_ovr.makeRenderTargetActive();
+ }
+ else
+ {
+ m_deviceCtx->OMSetRenderTargets(1, &m_backBufferColor, m_backBufferDepthStencil);
+ }
m_currentColor = m_backBufferColor;
m_currentDepthStencil = m_backBufferDepthStencil;
@@ -2233,16 +2252,6 @@ BX_PRAGMA_DIAGNOSTIC_POP();
capturePostReset();
}
- static bool isLost(HRESULT _hr)
- {
- return DXGI_ERROR_DEVICE_REMOVED == _hr
- || DXGI_ERROR_DEVICE_HUNG == _hr
- || DXGI_ERROR_DEVICE_RESET == _hr
- || DXGI_ERROR_DRIVER_INTERNAL_ERROR == _hr
- || DXGI_ERROR_NOT_CURRENTLY_AVAILABLE == _hr
- ;
- }
-
void flip(HMD& _hmd) BX_OVERRIDE
{
if (NULL != m_swapChain)
@@ -2255,22 +2264,30 @@ BX_PRAGMA_DIAGNOSTIC_POP();
for (uint32_t ii = 1, num = m_numWindows; ii < num && SUCCEEDED(hr); ++ii)
{
- hr = m_frameBuffers[m_windows[ii].idx].m_swapChain->Present(syncInterval, 0);
+ hr = m_frameBuffers[m_windows[ii].idx].present(syncInterval);
}
if (SUCCEEDED(hr) )
{
- m_ovr.flip();
- m_ovr.swap(_hmd); // TODO - move this out of end-of-frame
+ if (m_needPresent)
+ {
+ m_ovr.flip();
+ m_ovr.swap(_hmd);
- if (!m_ovr.isEnabled())
+ if (!m_ovr.isEnabled() )
+ {
+ hr = m_swapChain->Present(syncInterval, 0);
+ }
+
+ m_needPresent = false;
+ }
+ else
{
- hr = m_swapChain->Present(syncInterval, 0);
+ m_deviceCtx->Flush();
}
}
- if (FAILED(hr)
- && isLost(hr) )
+ if (isLost(hr) )
{
++m_lost;
BGFX_FATAL(10 > m_lost, bgfx::Fatal::DeviceLost, "Device is lost. FAILED 0x%08x", hr);
@@ -2552,7 +2569,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
}
- void setFrameBuffer(FrameBufferHandle _fbh, bool _msaa = true)
+ void setFrameBuffer(FrameBufferHandle _fbh, bool _msaa = true, bool _needPresent = true)
{
if (isValid(m_fbh)
&& m_fbh.idx != _fbh.idx
@@ -2564,20 +2581,25 @@ BX_PRAGMA_DIAGNOSTIC_POP();
if (!isValid(_fbh) )
{
- m_deviceCtx->OMSetRenderTargets(1, &m_backBufferColor, m_backBufferDepthStencil);
+ if (m_ovr.isEnabled() )
+ {
+ m_ovr.makeRenderTargetActive();
+ }
+ else
+ {
+ m_currentColor = m_backBufferColor;
+ m_currentDepthStencil = m_backBufferDepthStencil;
+ }
- m_currentColor = m_backBufferColor;
- m_currentDepthStencil = m_backBufferDepthStencil;
+ m_deviceCtx->OMSetRenderTargets(1, &m_currentColor, m_currentDepthStencil);
+ m_needPresent |= _needPresent;
}
else
{
invalidateTextureStage();
FrameBufferD3D11& frameBuffer = m_frameBuffers[_fbh.idx];
- m_deviceCtx->OMSetRenderTargets(frameBuffer.m_num, frameBuffer.m_rtv, frameBuffer.m_dsv);
-
- m_currentColor = frameBuffer.m_rtv[0];
- m_currentDepthStencil = frameBuffer.m_dsv;
+ frameBuffer.set();
}
m_fbh = _fbh;
@@ -3516,6 +3538,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
IDXGISwapChain1* m_swapChain;
#endif // BX_PLATFORM_WINDOWS
+ bool m_needPresent;
uint16_t m_lost;
uint16_t m_numWindows;
FrameBufferHandle m_windows[BGFX_CONFIG_MAX_FRAME_BUFFERS];
@@ -3641,99 +3664,109 @@ BX_PRAGMA_DIAGNOSTIC_POP();
#if BGFX_CONFIG_USE_OVR
VRImplOVRD3D11::VRImplOVRD3D11()
- : m_mirrorTexture(NULL)
+ : m_depthBuffer(NULL)
+ , m_msaaRtv(NULL)
+ , m_msaaTexture(NULL)
+ , m_textureSwapChain(NULL)
+ , m_mirrorTexture(NULL)
{
- memset(m_textureSwapChain, 0, sizeof(m_textureSwapChain));
+ memset(m_eyeRtv, 0, sizeof(m_eyeRtv));
}
bool VRImplOVRD3D11::createSwapChain(const VRDesc& _desc, int _msaaSamples, int _mirrorWidth, int _mirrorHeight)
{
+ if (!m_session)
+ {
+ return false;
+ }
+
ID3D11Device* device = s_renderD3D11->m_device;
- for (int eye = 0; eye < 2; ++eye)
- {
- if (NULL == m_textureSwapChain[eye])
+ if (NULL == m_textureSwapChain)
+ {
+ ovrTextureSwapChainDesc swapchainDesc = {};
+ swapchainDesc.Type = ovrTexture_2D;
+ swapchainDesc.Width = _desc.m_eyeSize[0].m_w + _desc.m_eyeSize[1].m_w;
+ swapchainDesc.Height = bx::uint32_max(_desc.m_eyeSize[0].m_h, _desc.m_eyeSize[1].m_h);
+ swapchainDesc.MipLevels = 1;
+ swapchainDesc.ArraySize = 1;
+ swapchainDesc.SampleCount = 1;
+ swapchainDesc.MiscFlags = ovrTextureMisc_DX_Typeless;
+ swapchainDesc.BindFlags = ovrTextureBind_DX_RenderTarget;
+ swapchainDesc.StaticImage = ovrFalse;
+ swapchainDesc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB;
+
+ ovrResult result = ovr_CreateTextureSwapChainDX(m_session, device, &swapchainDesc, &m_textureSwapChain);
+ if (!OVR_SUCCESS(result) )
{
- m_msaaTexture[eye] = NULL;
- m_msaaRtv[eye] = NULL;
- m_msaaSv[eye] = NULL;
-
- ovrTextureSwapChainDesc swapchainDesc = {};
- swapchainDesc.Type = ovrTexture_2D;
- swapchainDesc.ArraySize = 1;
- swapchainDesc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB;
- swapchainDesc.Width = _desc.m_eyeSize[eye].m_w;
- swapchainDesc.Height = _desc.m_eyeSize[eye].m_h;
- swapchainDesc.MipLevels = 1;
- swapchainDesc.SampleCount = 1;
- swapchainDesc.MiscFlags = ovrTextureMisc_DX_Typeless;
- swapchainDesc.BindFlags = ovrTextureBind_DX_RenderTarget;
- swapchainDesc.StaticImage = ovrFalse;
-
- ovrResult result = ovr_CreateTextureSwapChainDX(m_session, device, &swapchainDesc, &m_textureSwapChain[eye]);
- if (!OVR_SUCCESS(result))
- {
- destroySwapChain();
- return false;
- }
+ return false;
+ }
- memset(m_eyeRtv[eye], 0, sizeof(m_eyeRtv[eye]));
- int textureCount;
- ovr_GetTextureSwapChainLength(m_session, m_textureSwapChain[eye], &textureCount);
+ for (int eye = 0; eye < 2; ++eye)
+ {
+ m_renderLayer.ColorTexture[eye] = m_textureSwapChain;
+ }
- for (int ii = 0; ii < textureCount; ++ii)
+ // create MSAA target
+ if (_msaaSamples > 1)
+ {
+ D3D11_TEXTURE2D_DESC msDesc;
+ msDesc.Width = swapchainDesc.Width;
+ msDesc.Height = swapchainDesc.Height;
+ msDesc.MipLevels = 1;
+ msDesc.ArraySize = 1;
+ msDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ msDesc.SampleDesc.Count = _msaaSamples;
+ msDesc.SampleDesc.Quality = 0;
+ msDesc.Usage = D3D11_USAGE_DEFAULT;
+ msDesc.CPUAccessFlags = 0;
+ msDesc.MiscFlags = 0;
+ msDesc.BindFlags = D3D11_BIND_RENDER_TARGET;
+ DX_CHECK(device->CreateTexture2D(&msDesc, NULL, &m_msaaTexture) );
+ DX_CHECK(device->CreateRenderTargetView(m_msaaTexture, NULL, &m_msaaRtv) );
+ }
+ else
+ {
+ int swapchainSize;
+ result = ovr_GetTextureSwapChainLength(m_session, m_textureSwapChain, &swapchainSize);
+ if (!OVR_SUCCESS(result) )
{
- ID3D11Texture2D* tex = NULL;
- ovr_GetTextureSwapChainBufferDX(m_session, m_textureSwapChain[eye], ii, IID_PPV_ARGS(&tex));
- D3D11_RENDER_TARGET_VIEW_DESC rtvd = {};
- rtvd.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- rtvd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
-
- ID3D11RenderTargetView* rtv;
- DX_CHECK(device->CreateRenderTargetView(tex, &rtvd, &rtv));
- m_eyeRtv[eye][ii] = rtv;
- DX_RELEASE(tex, 1);
+ destroySwapChain();
+ return false;
}
- // setup depth buffer
- D3D11_TEXTURE2D_DESC dbDesc;
- dbDesc.Width = _desc.m_eyeSize[eye].m_w;
- dbDesc.Height = _desc.m_eyeSize[eye].m_h;
- dbDesc.MipLevels = 1;
- dbDesc.ArraySize = 1;
- dbDesc.Format = DXGI_FORMAT_D32_FLOAT;
- dbDesc.SampleDesc.Count = _msaaSamples;
- dbDesc.SampleDesc.Quality = 0;
- dbDesc.Usage = D3D11_USAGE_DEFAULT;
- dbDesc.CPUAccessFlags = 0;
- dbDesc.MiscFlags = 0;
- dbDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
- ID3D11Texture2D* tex;
- DX_CHECK(device->CreateTexture2D(&dbDesc, NULL, &tex));
- DX_CHECK(device->CreateDepthStencilView(tex, NULL, &m_depthBuffer[eye]));
- DX_RELEASE(tex, 0);
-
- // create MSAA render target
- if (_msaaSamples > 1)
+ BX_CHECK(swapchainSize <= BX_COUNTOF(m_eyeRtv), "Too many OVR swap chain entries %d", swapchainSize);
+ for (int ii = 0; ii < swapchainSize; ++ii)
{
- D3D11_TEXTURE2D_DESC dsDesc;
- dsDesc.Width = _desc.m_eyeSize[eye].m_w;
- dsDesc.Height = _desc.m_eyeSize[eye].m_h;
- dsDesc.MipLevels = 1;
- dsDesc.ArraySize = 1;
- dsDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- dsDesc.SampleDesc.Count = _msaaSamples;
- dsDesc.SampleDesc.Quality = 0;
- dsDesc.Usage = D3D11_USAGE_DEFAULT;
- dsDesc.CPUAccessFlags = 0;
- dsDesc.MiscFlags = 0;
- dsDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
-
- DX_CHECK(device->CreateTexture2D(&dsDesc, NULL, &m_msaaTexture[eye]));
- DX_CHECK(device->CreateShaderResourceView(m_msaaTexture[eye], NULL, &m_msaaSv[eye]));
- DX_CHECK(device->CreateRenderTargetView(m_msaaTexture[eye], NULL, &m_msaaRtv[eye]));
+ ID3D11Texture2D* texture;
+ ovr_GetTextureSwapChainBufferDX(m_session, m_textureSwapChain, ii, IID_PPV_ARGS(&texture) );
+
+ D3D11_RENDER_TARGET_VIEW_DESC viewDesc;
+ viewDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ viewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
+ viewDesc.Texture2D.MipSlice = 0;
+ DX_CHECK(device->CreateRenderTargetView(texture, &viewDesc, &m_eyeRtv[ii]) );
+ DX_RELEASE(texture, 1);
}
}
+
+ // create depth buffer
+ D3D11_TEXTURE2D_DESC dbDesc = {};
+ dbDesc.Width = swapchainDesc.Width;
+ dbDesc.Height = swapchainDesc.Height;
+ dbDesc.MipLevels = 1;
+ dbDesc.ArraySize = 1;
+ dbDesc.Format = DXGI_FORMAT_D32_FLOAT;
+ dbDesc.SampleDesc.Count = _msaaSamples;
+ dbDesc.SampleDesc.Quality = 0;
+ dbDesc.Usage = D3D11_USAGE_DEFAULT;
+ dbDesc.CPUAccessFlags = 0;
+ dbDesc.MiscFlags = 0;
+ dbDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
+ ID3D11Texture2D* depthTexture;
+ DX_CHECK(device->CreateTexture2D(&dbDesc, NULL, &depthTexture) );
+ DX_CHECK(device->CreateDepthStencilView(depthTexture, NULL, &m_depthBuffer) );
+ DX_RELEASE(depthTexture, 0);
}
if (NULL == m_mirrorTexture)
@@ -3747,46 +3780,27 @@ BX_PRAGMA_DIAGNOSTIC_POP();
BX_UNUSED(result);
}
- m_renderLayer.ColorTexture[0] = m_textureSwapChain[0];
- m_renderLayer.ColorTexture[1] = m_textureSwapChain[1];
return true;
}
void VRImplOVRD3D11::destroySwapChain()
{
- for (int eye = 0; eye < 2; ++eye)
+ if (NULL != m_textureSwapChain)
{
- if (m_textureSwapChain[eye])
- {
- for (uint32_t ii = 0; ii < BX_COUNTOF(m_eyeRtv[eye]); ++ii)
- {
- DX_RELEASE(m_eyeRtv[eye][ii], 0);
- }
-
- ovr_DestroyTextureSwapChain(m_session, m_textureSwapChain[eye]);
- m_textureSwapChain[eye] = NULL;
- m_depthBuffer[eye]->Release();
-
- if (NULL != m_msaaTexture[eye])
- {
- m_msaaTexture[eye]->Release();
- m_msaaTexture[eye] = NULL;
- }
-
- if (NULL != m_msaaSv[eye])
- {
- m_msaaSv[eye]->Release();
- m_msaaSv[eye] = NULL;
- }
+ BX_CHECK(m_session, "VRSWapChain destroyed without valid OVR session");
+ ovr_DestroyTextureSwapChain(m_session, m_textureSwapChain);
+ m_textureSwapChain = NULL;
+ }
- if (NULL != m_msaaRtv[eye])
- {
- m_msaaRtv[eye]->Release();
- m_msaaRtv[eye] = NULL;
- }
- }
+ for (int ii = 0, nn = BX_COUNTOF(m_eyeRtv); ii < nn; ++ii)
+ {
+ DX_RELEASE(m_eyeRtv[ii], 0);
}
+ DX_RELEASE(m_msaaRtv, 0);
+ DX_RELEASE(m_msaaTexture, 0);
+ DX_RELEASE(m_depthBuffer, 0);
+
destroyMirror();
}
@@ -3799,73 +3813,60 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
}
- void VRImplOVRD3D11::renderEyeStart(const VRDesc& _desc, uint8_t _eye)
+ void VRImplOVRD3D11::makeRenderTargetActive(const VRDesc& /*_desc*/)
{
- ID3D11DeviceContext* deviceCtx = s_renderD3D11->m_deviceCtx;
- float black[] = { 0.0f, 0.0f, 0.0f, 0.0f }; // Important that alpha=0, if want pixels to be transparent, for manual layers
-
- // render to MSAA target
- if (NULL != m_msaaTexture[_eye])
+ if (NULL != m_msaaRtv)
{
- deviceCtx->OMSetRenderTargets(1, &m_msaaRtv[_eye], m_depthBuffer[_eye]);
- deviceCtx->ClearRenderTargetView(m_msaaRtv[_eye], black);
- deviceCtx->ClearDepthStencilView(m_depthBuffer[_eye], D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1, 0);
+ s_renderD3D11->m_currentColor = m_msaaRtv;
}
- else // MSAA disabled? render directly to eye buffer
+ else
{
- int texIndex = 0;
- ovr_GetTextureSwapChainCurrentIndex(m_session, m_textureSwapChain[_eye], &texIndex);
-
- deviceCtx->OMSetRenderTargets(1, &m_eyeRtv[_eye][texIndex], m_depthBuffer[_eye]);
- deviceCtx->ClearRenderTargetView(m_eyeRtv[_eye][texIndex], black);
- deviceCtx->ClearDepthStencilView(m_depthBuffer[_eye], D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1, 0);
-
- D3D11_VIEWPORT D3Dvp;
- D3Dvp.TopLeftX = 0;
- D3Dvp.TopLeftY = 0;
- D3Dvp.Width = (FLOAT)_desc.m_eyeSize[_eye].m_w;
- D3Dvp.Height = (FLOAT)_desc.m_eyeSize[_eye].m_h;
- D3Dvp.MinDepth = 0;
- D3Dvp.MaxDepth = 1;
- deviceCtx->RSSetViewports(1, &D3Dvp);
+ int index;
+ ovr_GetTextureSwapChainCurrentIndex(m_session, m_textureSwapChain, &index);
+ s_renderD3D11->m_currentColor = m_eyeRtv[index];
}
+
+ s_renderD3D11->m_currentDepthStencil = m_depthBuffer;
}
bool VRImplOVRD3D11::submitSwapChain(const VRDesc& /* _desc */)
{
+ BX_CHECK(NULL != m_session, "No session in VRImplOVRD3D11::submitSwapChain. Usage error");
+ BX_CHECK(NULL != m_textureSwapChain, "VRImplOVRD3D11 submitted without a valid swap chain");
+
ID3D11DeviceContext* deviceCtx = s_renderD3D11->m_deviceCtx;
- IDXGISwapChain* swapChain = s_renderD3D11->m_swapChain;
- // resolve MSAA render targets
- for (int eye = 0; eye < 2; ++eye)
- {
- if (NULL != m_msaaTexture[eye])
- {
- int destIndex = 0;
- ovr_GetTextureSwapChainCurrentIndex(m_session, m_textureSwapChain[eye], &destIndex);
+ int index;
+ ovr_GetTextureSwapChainCurrentIndex(m_session, m_textureSwapChain, &index);
- ID3D11Resource* dstTex = NULL;
- ovr_GetTextureSwapChainBufferDX(m_session, m_textureSwapChain[eye], destIndex, IID_PPV_ARGS(&dstTex));
- deviceCtx->ResolveSubresource(dstTex, 0, m_msaaTexture[eye], 0, DXGI_FORMAT_R8G8B8A8_UNORM);
- dstTex->Release();
- }
+ ID3D11Texture2D* eyeTexture;
+ ovr_GetTextureSwapChainBufferDX(m_session, m_textureSwapChain, index, IID_PPV_ARGS(&eyeTexture));
- ovrResult result = ovr_CommitTextureSwapChain(m_session, m_textureSwapChain[eye]);
- if (!OVR_SUCCESS(result))
- {
- return false;
- }
+ // resolve MSAA
+ if (NULL != m_msaaRtv)
+ {
+ deviceCtx->ResolveSubresource(eyeTexture, 0, m_msaaTexture, 0, DXGI_FORMAT_R8G8B8A8_UNORM);
+ }
+
+ ovrResult result = ovr_CommitTextureSwapChain(m_session, m_textureSwapChain);
+ if (!OVR_SUCCESS(result) )
+ {
+ return false;
+ DX_RELEASE(eyeTexture, 1);
}
ovrLayerHeader* layerList = &m_renderLayer.Header;
- ovrResult result = ovr_SubmitFrame(m_session, 0, NULL, &layerList, 1);
- if (!OVR_SUCCESS(result))
+ result = ovr_SubmitFrame(m_session, 0, NULL, &layerList, 1);
+ if (!OVR_SUCCESS(result) )
{
+ DX_RELEASE(eyeTexture, 1);
return false;
}
if (result != ovrSuccess_NotVisible && NULL != m_mirrorTexture)
{
+ IDXGISwapChain* swapChain = s_renderD3D11->m_swapChain;
+
ID3D11Texture2D* tex = NULL;
ovr_GetMirrorTextureBufferDX(m_session, m_mirrorTexture, IID_PPV_ARGS(&tex));
ID3D11Texture2D* backBuffer;
@@ -3878,6 +3879,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
DX_RELEASE(backBuffer, 0);
}
+ DX_RELEASE(eyeTexture, 1);
return true;
}
@@ -4207,7 +4209,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) )
{
- const UniformInfo* info = s_renderD3D11->m_uniformReg.find(name);
+ const UniformRegInfo* info = s_renderD3D11->m_uniformReg.find(name);
BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
if (NULL != info)
@@ -4726,6 +4728,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
m_swapChain = NULL;
m_numTh = _num;
+ m_needPresent = false;
memcpy(m_attachment, _attachment, _num*sizeof(Attachment) );
postReset();
@@ -4787,6 +4790,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
m_num = 0;
m_numTh = 0;
+ m_needPresent = false;
uint16_t denseIdx = m_denseIdx;
m_denseIdx = UINT16_MAX;
@@ -5032,6 +5036,27 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
}
+ void FrameBufferD3D11::set()
+ {
+ s_renderD3D11->m_deviceCtx->OMSetRenderTargets(m_num, m_rtv, m_dsv);
+ m_needPresent = UINT16_MAX != m_denseIdx;
+ s_renderD3D11->m_currentColor = m_rtv[0];
+ s_renderD3D11->m_currentDepthStencil = m_dsv;
+ }
+
+ HRESULT FrameBufferD3D11::present(uint32_t _syncInterval)
+ {
+ if (m_needPresent)
+ {
+ HRESULT hr = m_swapChain->Present(_syncInterval, 0);
+ hr = !isLost(hr) ? S_OK : hr;
+ m_needPresent = false;
+ return hr;
+ }
+
+ return S_OK;
+ }
+
void TimerQueryD3D11::postReset()
{
ID3D11Device* device = s_renderD3D11->m_device;
@@ -5098,7 +5123,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
uint64_t timeEnd;
HRESULT hr = deviceCtx->GetData(frame.m_end, &timeEnd, sizeof(timeEnd), D3D11_ASYNC_GETDATA_DONOTFLUSH);
- if (S_OK == hr)
+ if (S_OK == hr
+ || isLost(hr) )
{
m_control.consume(1);
@@ -5278,7 +5304,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
// reset the framebuffer to be the backbuffer; depending on the swap effect,
// if we don't do this we'll only see one frame of output and then nothing
FrameBufferHandle invalid = BGFX_INVALID_HANDLE;
- setFrameBuffer(invalid);
+ setFrameBuffer(invalid, true, false);
bool viewRestart = false;
uint8_t eye = 0;
@@ -5288,7 +5314,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
int32_t numItems = _render->m_num;
for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
{
- const bool isCompute = key.decode(_render->m_sortKeys[item], _render->m_viewRemap);
+ const uint64_t encodedKey = _render->m_sortKeys[item];
+ const bool isCompute = key.decode(encodedKey, _render->m_viewRemap);
statsKeyType[isCompute]++;
const bool viewChanged = 0
@@ -5363,7 +5390,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
if (m_ovr.isEnabled() )
{
- m_ovr.renderEyeStart(eye, &viewState.m_rect);
+ m_ovr.getViewport(eye, &viewState.m_rect);
}
else
{
@@ -5402,7 +5429,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
prim = s_primInfo[BX_COUNTOF(s_primName)]; // Force primitive type update after clear quad.
}
- for (; blitItem < numBlitItems && blitKey.m_view <= view; blitItem++)
+ const uint8_t blitView = SortKey::decodeView(encodedKey);
+ for (; blitItem < numBlitItems && blitKey.m_view <= blitView; blitItem++)
{
const BlitItem& blit = _render->m_blitItem[blitItem];
blitKey.decode(_render->m_blitKeys[blitItem+1]);
@@ -6154,11 +6182,14 @@ BX_PRAGMA_DIAGNOSTIC_POP();
const int64_t timerFreq = bx::getHPFrequency();
- perfStats.cpuTimeEnd = now;
- perfStats.cpuTimerFreq = timerFreq;
- perfStats.gpuTimeBegin = m_gpuTimer.m_begin;
- perfStats.gpuTimeEnd = m_gpuTimer.m_end;
- perfStats.gpuTimerFreq = m_gpuTimer.m_frequency;
+ perfStats.cpuTimeEnd = now;
+ perfStats.cpuTimerFreq = timerFreq;
+ perfStats.gpuTimeBegin = m_gpuTimer.m_begin;
+ perfStats.gpuTimeEnd = m_gpuTimer.m_end;
+ perfStats.gpuTimerFreq = m_gpuTimer.m_frequency;
+ perfStats.numDraw = statsKeyType[0];
+ perfStats.numCompute = statsKeyType[1];
+ perfStats.maxGpuLatency = maxGpuLatency;
if (_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) )
{