summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/renderer.h
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/renderer.h')
-rw-r--r--3rdparty/bgfx/src/renderer.h155
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