diff options
Diffstat (limited to '3rdparty/bgfx/src/renderer.h')
-rw-r--r-- | 3rdparty/bgfx/src/renderer.h | 155 |
1 files changed, 142 insertions, 13 deletions
diff --git a/3rdparty/bgfx/src/renderer.h b/3rdparty/bgfx/src/renderer.h index 1bf8fbba072..e5c1cbd4c2f 100644 --- a/3rdparty/bgfx/src/renderer.h +++ b/3rdparty/bgfx/src/renderer.h @@ -10,6 +10,37 @@ namespace bgfx { + struct BlitState + { + BlitState(const Frame* _frame) + : m_frame(_frame) + , m_item(0) + { + m_key.decode(_frame->m_blitKeys[0]); + } + + bool hasItem(uint16_t _view) const + { + return m_item < m_frame->m_numBlitItems + && m_key.m_view <= _view + ; + } + + const BlitItem& advance() + { + const BlitItem& bi = m_frame->m_blitItem[m_key.m_item]; + + ++m_item; + m_key.decode(m_frame->m_blitKeys[m_item]); + + return bi; + } + + const Frame* m_frame; + BlitKey m_key; + uint16_t m_item; + }; + struct ViewState { ViewState() @@ -28,7 +59,7 @@ namespace bgfx m_invProjCached = UINT16_MAX; m_invViewProjCached = UINT16_MAX; - m_view[0] = _frame->m_view; + m_view[0] = m_viewTmp[0]; m_view[1] = m_viewTmp[1]; if (_hmdEnabled) @@ -48,20 +79,27 @@ namespace bgfx for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) { - if (BGFX_VIEW_STEREO == (_frame->m_viewFlags[ii] & BGFX_VIEW_STEREO) ) + if (BGFX_VIEW_STEREO == (_frame->m_view[ii].m_flags & BGFX_VIEW_STEREO) ) { bx::float4x4_mul(&m_view[eye][ii].un.f4x4 - , &_frame->m_view[ii].un.f4x4 + , &_frame->m_view[ii].m_view.un.f4x4 , &viewAdjust.un.f4x4 ); } else { - bx::memCopy(&m_view[0][ii].un.f4x4, &_frame->m_view[ii].un.f4x4, sizeof(Matrix4) ); + bx::memCopy(&m_view[0][ii].un.f4x4, &_frame->m_view[ii].m_view.un.f4x4, sizeof(Matrix4) ); } } } } + else + { + for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) + { + bx::memCopy(&m_view[0][ii].un.f4x4, &_frame->m_view[ii].m_view.un.f4x4, sizeof(Matrix4) ); + } + } for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) { @@ -69,18 +107,20 @@ namespace bgfx { bx::float4x4_mul(&m_viewProj[eye][ii].un.f4x4 , &m_view[eye][ii].un.f4x4 - , &_frame->m_proj[eye][ii].un.f4x4 + , &_frame->m_view[ii].m_proj[eye].un.f4x4 ); } } } template<uint16_t mtxRegs, typename RendererContext, typename Program, typename Draw> - void setPredefined(RendererContext* _renderer, uint16_t _view, uint8_t _eye, Program& _program, Frame* _frame, const Draw& _draw) + void setPredefined(RendererContext* _renderer, uint16_t _view, uint8_t _eye, const Program& _program, const Frame* _frame, const Draw& _draw) { + const FrameCache& frameCache = _frame->m_frameCache; + for (uint32_t ii = 0, num = _program.m_numPredefined; ii < num; ++ii) { - PredefinedUniform& predefined = _program.m_predefined[ii]; + const PredefinedUniform& predefined = _program.m_predefined[ii]; uint8_t flags = predefined.m_type&BGFX_UNIFORM_FRAGMENTBIT; switch (predefined.m_type&(~BGFX_UNIFORM_FRAGMENTBIT) ) { @@ -147,7 +187,7 @@ namespace bgfx { _renderer->setShaderUniform4x4f(flags , predefined.m_loc - , _frame->m_proj[_eye][_view].un.val + , _frame->m_view[_view].m_proj[_eye].un.val , bx::uint32_min(mtxRegs, predefined.m_count) ); } @@ -160,7 +200,7 @@ namespace bgfx { m_invProjCached = viewEye; bx::float4x4_inverse(&m_invProj.un.f4x4 - , &_frame->m_proj[_eye][_view].un.f4x4 + , &_frame->m_view[_view].m_proj[_eye].un.f4x4 ); } @@ -203,11 +243,11 @@ namespace bgfx case PredefinedUniform::Model: { - const Matrix4& model = _frame->m_matrixCache.m_cache[_draw.m_matrix]; + const Matrix4& model = frameCache.m_matrixCache.m_cache[_draw.m_startMatrix]; _renderer->setShaderUniform4x4f(flags , predefined.m_loc , model.un.val - , bx::uint32_min(_draw.m_num*mtxRegs, predefined.m_count) + , bx::uint32_min(_draw.m_numMatrices*mtxRegs, predefined.m_count) ); } break; @@ -215,7 +255,7 @@ namespace bgfx case PredefinedUniform::ModelView: { Matrix4 modelView; - const Matrix4& model = _frame->m_matrixCache.m_cache[_draw.m_matrix]; + const Matrix4& model = frameCache.m_matrixCache.m_cache[_draw.m_startMatrix]; bx::float4x4_mul(&modelView.un.f4x4 , &model.un.f4x4 , &m_view[_eye][_view].un.f4x4 @@ -231,7 +271,7 @@ namespace bgfx case PredefinedUniform::ModelViewProj: { Matrix4 modelViewProj; - const Matrix4& model = _frame->m_matrixCache.m_cache[_draw.m_matrix]; + const Matrix4& model = frameCache.m_matrixCache.m_cache[_draw.m_startMatrix]; bx::float4x4_mul(&modelViewProj.un.f4x4 , &model.un.f4x4 , &m_viewProj[_eye][_view].un.f4x4 @@ -436,6 +476,95 @@ namespace bgfx HashMap m_hashMap; }; + inline bool hasVertexStreamChanged(const RenderDraw& _current, const RenderDraw& _new) + { + if (_current.m_streamMask != _new.m_streamMask + || _current.m_instanceDataBuffer.idx != _new.m_instanceDataBuffer.idx + || _current.m_instanceDataOffset != _new.m_instanceDataOffset + || _current.m_instanceDataStride != _new.m_instanceDataStride) + { + return true; + } + + for (uint32_t idx = 0, streamMask = _new.m_streamMask, ntz = bx::uint32_cnttz(streamMask) + ; 0 != streamMask + ; streamMask >>= 1, idx += 1, ntz = bx::uint32_cnttz(streamMask) + ) + { + streamMask >>= ntz; + idx += ntz; + + if (_current.m_stream[idx].m_handle.idx != _new.m_stream[idx].m_handle.idx + || _current.m_stream[idx].m_startVertex != _new.m_stream[idx].m_startVertex) + { + return true; + } + } + + return false; + } + + template<typename Ty> + struct Profiler + { + Profiler(Frame* _frame, Ty& _gpuTimer, const char (*_viewName)[BGFX_CONFIG_MAX_VIEW_NAME], bool _enabled = true) + : m_viewName(_viewName) + , m_frame(_frame) + , m_gpuTimer(_gpuTimer) + , m_queryIdx(UINT32_MAX) + , m_numViews(0) + , m_enabled(_enabled && 0 != (_frame->m_debug & BGFX_DEBUG_PROFILER) ) + { + } + + ~Profiler() + { + m_frame->m_perfStats.numViews = m_numViews; + } + + void begin(uint16_t _view) + { + if (m_enabled) + { + ViewStats& viewStats = m_frame->m_perfStats.viewStats[m_numViews]; + viewStats.cpuTimeElapsed = -bx::getHPCounter(); + + m_queryIdx = m_gpuTimer.begin(_view); + + viewStats.view = ViewId(_view); + bx::strCopy(viewStats.name + , BGFX_CONFIG_MAX_VIEW_NAME + , &m_viewName[_view][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] + ); + } + } + + void end() + { + if (m_enabled + && UINT32_MAX != m_queryIdx) + { + m_gpuTimer.end(m_queryIdx); + + ViewStats& viewStats = m_frame->m_perfStats.viewStats[m_numViews]; + const typename Ty::Result& result = m_gpuTimer.m_result[viewStats.view]; + + viewStats.cpuTimeElapsed += bx::getHPCounter(); + viewStats.gpuTimeElapsed = result.m_end - result.m_begin; + + ++m_numViews; + m_queryIdx = UINT32_MAX; + } + } + + const char (*m_viewName)[BGFX_CONFIG_MAX_VIEW_NAME]; + Frame* m_frame; + Ty& m_gpuTimer; + uint32_t m_queryIdx; + uint16_t m_numViews; + bool m_enabled; + }; + } // namespace bgfx #endif // BGFX_RENDERER_H_HEADER_GUARD |