diff --git a/src/bgfx.cpp b/src/bgfx.cpp index 643d9a31f..5a875a063 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -1659,12 +1659,12 @@ namespace bgfx return m_uniformRef[_handle.idx].m_name.getPtr(); } - RenderFrame::Enum Context::renderFrame(int32_t _msecs) - { - BGFX_PROFILER_SCOPE(bgfx, render_frame, 0xff2040ff); + RendererContextI* rendererCreate(RendererType::Enum _type); + void rendererDestroy(RendererContextI* _renderCtx); + void Context::flip() + { if (m_rendererInitialized - && !m_flipAfterRender && !m_flipped) { m_renderCtx->flip(m_render->m_hmd); @@ -1673,10 +1673,22 @@ namespace bgfx if (m_renderCtx->isDeviceRemoved() ) { // Something horribly went wrong, fallback to noop renderer. - m_renderCtx = m_renderNoop; - g_caps.rendererType = m_renderCtx->getRendererType(); + rendererDestroy(m_renderCtx); + + m_renderCtx = rendererCreate(RendererType::Noop); + g_caps.rendererType = RendererType::Noop; } } + } + + RenderFrame::Enum Context::renderFrame(int32_t _msecs) + { + BGFX_PROFILER_SCOPE(bgfx, render_frame, 0xff2040ff); + + if (!m_flipAfterRender) + { + flip(); + } if (apiSemWait(_msecs) ) { @@ -1691,11 +1703,9 @@ namespace bgfx renderSemPost(); - if (m_rendererInitialized - && m_flipAfterRender) + if (m_flipAfterRender) { - m_renderCtx->flip(m_render->m_hmd); - m_flipped = true; + flip(); } } else @@ -2027,9 +2037,9 @@ namespace bgfx RendererType::Enum type; _cmdbuf.read(type); - m_renderMain = rendererCreate(type); + m_renderCtx = rendererCreate(type); - m_rendererInitialized = NULL != m_renderMain; + m_rendererInitialized = NULL != m_renderCtx; if (!m_rendererInitialized) { @@ -2039,12 +2049,6 @@ namespace bgfx ); return; } - - m_renderCtx = m_renderMain; - m_renderNoop = RendererType::Noop != type - ? rendererCreate(RendererType::Noop) - : NULL - ; } break; } @@ -2068,14 +2072,9 @@ namespace bgfx { BX_CHECK(!m_rendererInitialized && !m_exit, "This shouldn't happen! Bad synchronization?"); + rendererDestroy(m_renderCtx); m_renderCtx = NULL; - rendererDestroy(m_renderMain); - m_renderMain = NULL; - - rendererDestroy(m_renderNoop); - m_renderNoop = NULL; - m_exit = true; } // fall through diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 280d45f53..9936cf8a1 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -4144,6 +4144,7 @@ namespace bgfx const char* getName(UniformHandle _handle) const; // render thread + void flip(); RenderFrame::Enum renderFrame(int32_t _msecs = -1); void flushTextureUpdateBatch(CommandBuffer& _cmdbuf); void rendererExecCommands(CommandBuffer& _cmdbuf); diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 30223ee86..9d45f464d 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -2334,13 +2334,13 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } m_lost = d3d11::isLost(hr); - BGFX_FATAL(!m_lost - , bgfx::Fatal::DeviceLost - , "Device is lost. FAILED 0x%08x %s (%s)" - , hr - , getLostReason(hr) - , DXGI_ERROR_DEVICE_REMOVED == hr ? getLostReason(m_device->GetDeviceRemovedReason() ) : "no info" - ); +// BGFX_FATAL(!m_lost +// , bgfx::Fatal::DeviceLost +// , "Device is lost. FAILED 0x%08x %s (%s)" +// , hr +// , getLostReason(hr) +// , DXGI_ERROR_DEVICE_REMOVED == hr ? getLostReason(m_device->GetDeviceRemovedReason() ) : "no info" +// ); } } diff --git a/src/renderer_noop.cpp b/src/renderer_noop.cpp index 5a1e2285e..3f247560d 100644 --- a/src/renderer_noop.cpp +++ b/src/renderer_noop.cpp @@ -11,28 +11,32 @@ namespace bgfx { namespace noop { RendererContextNOOP() { - // Pretend all features that are not returning results to CPU - // are available. + // Pretend all features are available. g_caps.supported = 0 - | BGFX_CAPS_TEXTURE_COMPARE_LEQUAL - | BGFX_CAPS_TEXTURE_COMPARE_ALL - | BGFX_CAPS_TEXTURE_3D - | BGFX_CAPS_VERTEX_ATTRIB_HALF - | BGFX_CAPS_VERTEX_ATTRIB_UINT10 - | BGFX_CAPS_INSTANCING - | BGFX_CAPS_FRAGMENT_DEPTH + | BGFX_CAPS_ALPHA_TO_COVERAGE | BGFX_CAPS_BLEND_INDEPENDENT | BGFX_CAPS_COMPUTE - | BGFX_CAPS_FRAGMENT_ORDERING - | BGFX_CAPS_SWAP_CHAIN - | BGFX_CAPS_INDEX32 - | BGFX_CAPS_DRAW_INDIRECT - | BGFX_CAPS_HIDPI - | BGFX_CAPS_TEXTURE_BLIT - | BGFX_CAPS_ALPHA_TO_COVERAGE | BGFX_CAPS_CONSERVATIVE_RASTER + | BGFX_CAPS_DRAW_INDIRECT + | BGFX_CAPS_FRAGMENT_DEPTH + | BGFX_CAPS_FRAGMENT_ORDERING + | BGFX_CAPS_GRAPHICS_DEBUGGER + | BGFX_CAPS_HIDPI + | BGFX_CAPS_HMD + | BGFX_CAPS_INDEX32 + | BGFX_CAPS_INSTANCING + | BGFX_CAPS_OCCLUSION_QUERY + | BGFX_CAPS_RENDERER_MULTITHREADED + | BGFX_CAPS_SWAP_CHAIN | BGFX_CAPS_TEXTURE_2D_ARRAY + | BGFX_CAPS_TEXTURE_3D + | BGFX_CAPS_TEXTURE_BLIT + | BGFX_CAPS_TEXTURE_COMPARE_ALL + | BGFX_CAPS_TEXTURE_COMPARE_LEQUAL | BGFX_CAPS_TEXTURE_CUBE_ARRAY + | BGFX_CAPS_TEXTURE_READ_BACK + | BGFX_CAPS_VERTEX_ATTRIB_HALF + | BGFX_CAPS_VERTEX_ATTRIB_UINT10 ; }