Increased number of views to 256. Added view remap support.

This commit is contained in:
Branimir Karadžić 2015-02-21 15:40:51 -08:00
parent ca3a6e5c84
commit 2883be5c1a
7 changed files with 75 additions and 12 deletions

View file

@ -1098,6 +1098,15 @@ namespace bgfx
/// view will use these matrices. /// view will use these matrices.
void setViewTransform(uint8_t _id, const void* _view, const void* _projL, uint8_t _flags = BGFX_VIEW_STEREO, const void* _projR = NULL); void setViewTransform(uint8_t _id, const void* _view, const void* _projL, uint8_t _flags = BGFX_VIEW_STEREO, const void* _projR = NULL);
/// Post submit view reordering.
///
/// @param _id First view id.
/// @param _num Number of views to remap.
/// @param _remap View remap id table. Passing `NULL` will reset view ids
/// to default state.
///
void setViewRemap(uint8_t _id = 0, uint8_t _num = UINT8_MAX, const void* _remap = NULL);
/// Sets debug marker. /// Sets debug marker.
void setMarker(const char* _marker); void setMarker(const char* _marker);

View file

@ -797,6 +797,10 @@ namespace bgfx
void Frame::sort() void Frame::sort()
{ {
for (uint32_t ii = 0, num = m_num; ii < num; ++ii)
{
m_sortKeys[ii] = SortKey::remapView(m_sortKeys[ii], m_viewRemap);
}
bx::radixSort64(m_sortKeys, s_ctx->m_tempKeys, m_sortValues, s_ctx->m_tempValues, m_num); bx::radixSort64(m_sortKeys, s_ctx->m_tempKeys, m_sortValues, s_ctx->m_tempValues, m_num);
} }
@ -951,6 +955,11 @@ namespace bgfx
BX_TRACE("Multithreaded renderer is disabled."); BX_TRACE("Multithreaded renderer is disabled.");
#endif // BGFX_CONFIG_MULTITHREADED #endif // BGFX_CONFIG_MULTITHREADED
for (uint32_t ii = 0; ii < BX_COUNTOF(m_viewRemap); ++ii)
{
m_viewRemap[ii] = ii;
}
memset(m_fb, 0xff, sizeof(m_fb) ); memset(m_fb, 0xff, sizeof(m_fb) );
memset(m_clear, 0, sizeof(m_clear) ); memset(m_clear, 0, sizeof(m_clear) );
memset(m_rect, 0, sizeof(m_rect) ); memset(m_rect, 0, sizeof(m_rect) );
@ -1156,6 +1165,8 @@ namespace bgfx
freeDynamicBuffers(); freeDynamicBuffers();
m_submit->m_resolution = m_resolution; m_submit->m_resolution = m_resolution;
m_submit->m_debug = m_debug; m_submit->m_debug = m_debug;
memcpy(m_submit->m_viewRemap, m_viewRemap, sizeof(m_viewRemap) );
memcpy(m_submit->m_fb, m_fb, sizeof(m_fb) ); memcpy(m_submit->m_fb, m_fb, sizeof(m_fb) );
memcpy(m_submit->m_clear, m_clear, sizeof(m_clear) ); memcpy(m_submit->m_clear, m_clear, sizeof(m_clear) );
memcpy(m_submit->m_rect, m_rect, sizeof(m_rect) ); memcpy(m_submit->m_rect, m_rect, sizeof(m_rect) );
@ -2673,6 +2684,13 @@ again:
s_ctx->setViewTransform(_id, _view, _projL, _flags, _projR); s_ctx->setViewTransform(_id, _view, _projL, _flags, _projR);
} }
void setViewRemap(uint8_t _id, uint8_t _num, const void* _remap)
{
BGFX_CHECK_MAIN_THREAD();
BX_CHECK(_id < BGFX_CONFIG_MAX_VIEWS, "Invalid view id: %d", _id);
s_ctx->setViewRemap(_id, _num, _remap);
}
void setMarker(const char* _marker) void setMarker(const char* _marker)
{ {
BGFX_CHECK_MAIN_THREAD(); BGFX_CHECK_MAIN_THREAD();

View file

@ -679,8 +679,10 @@ namespace bgfx
}; };
#define SORT_KEY_RENDER_DRAW (UINT64_C(1)<<0x2b) #define SORT_KEY_RENDER_DRAW (UINT64_C(1)<<0x2b)
#define SORT_KEY_VIEW_SHIFT UINT8_C(0x37)
#define SORT_KEY_VIEW_MASK ( (uint64_t(BGFX_CONFIG_MAX_VIEWS-1) )<<SORT_KEY_VIEW_SHIFT)
BX_STATIC_ASSERT(BGFX_CONFIG_MAX_VIEWS <= 32); BX_STATIC_ASSERT(BGFX_CONFIG_MAX_VIEWS <= 256);
BX_STATIC_ASSERT( (BGFX_CONFIG_MAX_PROGRAMS & (BGFX_CONFIG_MAX_PROGRAMS-1) ) == 0); // must be power of 2 BX_STATIC_ASSERT( (BGFX_CONFIG_MAX_PROGRAMS & (BGFX_CONFIG_MAX_PROGRAMS-1) ) == 0); // must be power of 2
struct SortKey struct SortKey
@ -689,7 +691,7 @@ namespace bgfx
{ {
// | 3 2 1 0| // | 3 2 1 0|
// |fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210| // |fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210|
// | vvvvvsssssssssssdttpppppppppdddddddddddddddddddddddddddddddd| // | vvvvvvvvsssssssssssdttpppppppppdddddddddddddddddddddddddddddddd|
// | ^ ^^ ^ ^ ^| // | ^ ^^ ^ ^ ^|
// | | || | | || // | | || | | ||
// | view-+ seq-+| +-trans +-program depth-+| // | view-+ seq-+| +-trans +-program depth-+|
@ -699,7 +701,7 @@ namespace bgfx
const uint64_t program = uint64_t(m_program)<<0x20; const uint64_t program = uint64_t(m_program)<<0x20;
const uint64_t trans = uint64_t(m_trans )<<0x29; const uint64_t trans = uint64_t(m_trans )<<0x29;
const uint64_t seq = uint64_t(m_seq )<<0x2c; const uint64_t seq = uint64_t(m_seq )<<0x2c;
const uint64_t view = uint64_t(m_view )<<0x37; const uint64_t view = uint64_t(m_view )<<SORT_KEY_VIEW_SHIFT;
const uint64_t key = depth|program|trans|SORT_KEY_RENDER_DRAW|seq|view; const uint64_t key = depth|program|trans|SORT_KEY_RENDER_DRAW|seq|view;
return key; return key;
} }
@ -708,7 +710,7 @@ namespace bgfx
{ {
// | 3 2 1 0| // | 3 2 1 0|
// |fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210| // |fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210|
// | vvvvvsssssssssssdppppppppp | // | vvvvvvvvsssssssssssdppppppppp |
// | ^ ^^ ^ | // | ^ ^^ ^ |
// | | || | | // | | || | |
// | view-+ seq-+| +-program | // | view-+ seq-+| +-program |
@ -716,7 +718,7 @@ namespace bgfx
const uint64_t program = uint64_t(m_program)<<0x22; const uint64_t program = uint64_t(m_program)<<0x22;
const uint64_t seq = uint64_t(m_seq )<<0x2c; const uint64_t seq = uint64_t(m_seq )<<0x2c;
const uint64_t view = uint64_t(m_view )<<0x37; const uint64_t view = uint64_t(m_view )<<SORT_KEY_VIEW_SHIFT;
const uint64_t key = program|seq|view; const uint64_t key = program|seq|view;
return key; return key;
} }
@ -725,7 +727,7 @@ namespace bgfx
bool decode(uint64_t _key) bool decode(uint64_t _key)
{ {
m_seq = (_key>>0x2c)& 0x7ff; m_seq = (_key>>0x2c)& 0x7ff;
m_view = (_key>>0x37)&(BGFX_CONFIG_MAX_VIEWS-1); m_view = uint8_t( (_key&SORT_KEY_VIEW_MASK)>>SORT_KEY_VIEW_SHIFT);
if (_key & SORT_KEY_RENDER_DRAW) if (_key & SORT_KEY_RENDER_DRAW)
{ {
m_depth = _key & 0xffffffff; m_depth = _key & 0xffffffff;
@ -738,6 +740,21 @@ namespace bgfx
return true; // compute return true; // compute
} }
bool decode(uint64_t _key, uint8_t _viewRemap[BGFX_CONFIG_MAX_VIEWS])
{
bool compute = decode(_key);
m_view = _viewRemap[m_view];
return compute;
}
static uint64_t remapView(uint64_t _key, uint8_t _viewRemap[BGFX_CONFIG_MAX_VIEWS])
{
const uint8_t oldView = uint8_t( (_key & SORT_KEY_VIEW_MASK) >> SORT_KEY_VIEW_SHIFT);
const uint64_t view = uint64_t(_viewRemap[oldView]) << SORT_KEY_VIEW_SHIFT;
const uint64_t key = (_key & ~SORT_KEY_VIEW_MASK) | view;
return key;
}
void reset() void reset()
{ {
m_depth = 0; m_depth = 0;
@ -1564,6 +1581,7 @@ namespace bgfx
SortKey m_key; SortKey m_key;
uint8_t m_viewRemap[BGFX_CONFIG_MAX_VIEWS];
FrameBufferHandle m_fb[BGFX_CONFIG_MAX_VIEWS]; FrameBufferHandle m_fb[BGFX_CONFIG_MAX_VIEWS];
Clear m_clear[BGFX_CONFIG_MAX_VIEWS]; Clear m_clear[BGFX_CONFIG_MAX_VIEWS];
float m_clearColor[BGFX_CONFIG_MAX_CLEAR_COLOR_PALETTE][4]; float m_clearColor[BGFX_CONFIG_MAX_CLEAR_COLOR_PALETTE][4];
@ -3038,6 +3056,23 @@ namespace bgfx
} }
} }
BGFX_API_FUNC(void setViewRemap(uint8_t _id, uint8_t _num, const void* _remap) )
{
const uint32_t num = bx::uint32_min( (BGFX_CONFIG_MAX_VIEWS - _id) + _num, BGFX_CONFIG_MAX_VIEWS) - _id;
if (NULL == _remap)
{
for (uint32_t ii = 0; ii < num; ++ii)
{
uint8_t id = uint8_t(ii+_id);
m_viewRemap[id] = id;
}
}
else
{
memcpy(&m_viewRemap[_id], _remap, num);
}
}
BGFX_API_FUNC(void setMarker(const char* _marker) ) BGFX_API_FUNC(void setMarker(const char* _marker) )
{ {
m_submit->setMarker(_marker); m_submit->setMarker(_marker);
@ -3358,6 +3393,7 @@ namespace bgfx
FrameBufferRef m_frameBufferRef[BGFX_CONFIG_MAX_FRAME_BUFFERS]; FrameBufferRef m_frameBufferRef[BGFX_CONFIG_MAX_FRAME_BUFFERS];
VertexDeclRef m_declRef; VertexDeclRef m_declRef;
uint8_t m_viewRemap[BGFX_CONFIG_MAX_VIEWS];
FrameBufferHandle m_fb[BGFX_CONFIG_MAX_VIEWS]; FrameBufferHandle m_fb[BGFX_CONFIG_MAX_VIEWS];
Clear m_clear[BGFX_CONFIG_MAX_VIEWS]; Clear m_clear[BGFX_CONFIG_MAX_VIEWS];

View file

@ -168,7 +168,7 @@
#ifndef BGFX_CONFIG_MAX_VIEWS #ifndef BGFX_CONFIG_MAX_VIEWS
// Do not change. Must be power of 2. // Do not change. Must be power of 2.
# define BGFX_CONFIG_MAX_VIEWS 32 # define BGFX_CONFIG_MAX_VIEWS 256
#endif // BGFX_CONFIG_MAX_VIEWS #endif // BGFX_CONFIG_MAX_VIEWS
#define BGFX_CONFIG_MAX_VIEW_NAME_RESERVED 5 #define BGFX_CONFIG_MAX_VIEW_NAME_RESERVED 5

View file

@ -726,7 +726,7 @@ namespace bgfx
} }
// Init reserved part of view name. // Init reserved part of view name.
for (uint8_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
{ {
char name[BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1]; char name[BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1];
bx::snprintf(name, sizeof(name), "%3d ", ii); bx::snprintf(name, sizeof(name), "%3d ", ii);
@ -3051,7 +3051,7 @@ namespace bgfx
int32_t numItems = _render->m_num; int32_t numItems = _render->m_num;
for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;) for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
{ {
const bool isCompute = key.decode(_render->m_sortKeys[item]); const bool isCompute = key.decode(_render->m_sortKeys[item], _render->m_viewRemap);
const bool viewChanged = 0 const bool viewChanged = 0
|| key.m_view != view || key.m_view != view
|| item == numItems || item == numItems

View file

@ -570,7 +570,7 @@ namespace bgfx
} }
// Init reserved part of view name. // Init reserved part of view name.
for (uint8_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
{ {
char name[BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1]; char name[BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1];
bx::snprintf(name, sizeof(name), "%3d ", ii); bx::snprintf(name, sizeof(name), "%3d ", ii);
@ -2864,7 +2864,7 @@ namespace bgfx
{ {
for (uint32_t item = 0, numItems = _render->m_num; item < numItems; ++item) for (uint32_t item = 0, numItems = _render->m_num; item < numItems; ++item)
{ {
const bool isCompute = key.decode(_render->m_sortKeys[item]); const bool isCompute = key.decode(_render->m_sortKeys[item], _render->m_viewRemap);
if (isCompute) if (isCompute)
{ {

View file

@ -4292,7 +4292,7 @@ namespace bgfx
int32_t numItems = _render->m_num; int32_t numItems = _render->m_num;
for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;) for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
{ {
const bool isCompute = key.decode(_render->m_sortKeys[item]); const bool isCompute = key.decode(_render->m_sortKeys[item], _render->m_viewRemap);
const bool viewChanged = 0 const bool viewChanged = 0
|| key.m_view != view || key.m_view != view
|| item == numItems || item == numItems