MAINT-646 Faster traversal of render batch lists.
parent
defbd61d31
commit
096fe03786
|
|
@ -442,7 +442,7 @@ void LLRenderPass::renderTexture(U32 type, U32 mask)
|
|||
|
||||
void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture, BOOL batch_textures)
|
||||
{
|
||||
for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
|
||||
for (LLCullResult::drawinfo_iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
|
||||
{
|
||||
LLDrawInfo* pparams = *i;
|
||||
if (pparams)
|
||||
|
|
|
|||
|
|
@ -348,7 +348,7 @@ void LLDrawPoolAlpha::render(S32 pass)
|
|||
|
||||
void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
|
||||
{
|
||||
for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
|
||||
for (LLCullResult::sg_iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
|
||||
{
|
||||
LLSpatialGroup* group = *i;
|
||||
if (group->mSpatialPartition->mRenderByGroup &&
|
||||
|
|
@ -385,7 +385,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
|
|||
|
||||
BOOL use_shaders = gPipeline.canUseVertexShaders();
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
|
||||
for (LLCullResult::sg_iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
|
||||
{
|
||||
LLSpatialGroup* group = *i;
|
||||
llassert(group);
|
||||
|
|
|
|||
|
|
@ -1036,9 +1036,13 @@ void LLDrawPoolAvatar::endDeferredSkinned()
|
|||
gGL.getTexUnit(0)->activate();
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_RENDER_AVATARS("renderAvatars");
|
||||
|
||||
|
||||
void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
||||
{
|
||||
LLFastTimer t(FTM_RENDER_AVATARS);
|
||||
|
||||
if (pass == -1)
|
||||
{
|
||||
for (S32 i = 1; i < getNumPasses(); i++)
|
||||
|
|
@ -1195,15 +1199,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
|||
|
||||
if (pass >= 7 && pass < 9)
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
|
||||
gGL.setColorMask(true, true);
|
||||
gGL.blendFunc(LLRender::BF_SOURCE_ALPHA,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA,
|
||||
LLRender::BF_ZERO,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
|
||||
|
||||
|
||||
if (pass == 7)
|
||||
{
|
||||
renderRiggedAlpha(avatarp);
|
||||
|
|
@ -1219,20 +1214,8 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
|||
|
||||
if (pass == 9)
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
LLGLDisable test(GL_ALPHA_TEST);
|
||||
gGL.flush();
|
||||
|
||||
LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
|
||||
glPolygonOffset(-1.0f, -1.0f);
|
||||
gGL.setSceneBlendType(LLRender::BT_ADD);
|
||||
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
|
||||
gGL.setColorMask(false, true);
|
||||
|
||||
renderRiggedGlow(avatarp);
|
||||
gGL.setColorMask(true, false);
|
||||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1430,7 +1413,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
|
|||
|
||||
void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
{
|
||||
if (avatar->isSelf() && !gAgent.needsRenderAvatar() || !gMeshRepo.meshRezEnabled())
|
||||
if (avatar->isSelf() && !gAgent.needsRenderAvatar())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -1559,8 +1542,12 @@ void LLDrawPoolAvatar::renderDeferredRiggedBump(LLVOAvatar* avatar)
|
|||
renderRigged(avatar, RIGGED_DEFERRED_BUMP);
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_RIGGED_VBO("Rigged VBO");
|
||||
|
||||
void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)
|
||||
{
|
||||
LLFastTimer t(FTM_RIGGED_VBO);
|
||||
|
||||
//update rigged vertex buffers
|
||||
for (U32 type = 0; type < NUM_RIGGED_PASSES; ++type)
|
||||
{
|
||||
|
|
@ -1632,17 +1619,56 @@ void LLDrawPoolAvatar::renderRiggedFullbrightShiny(LLVOAvatar* avatar)
|
|||
|
||||
void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)
|
||||
{
|
||||
renderRigged(avatar, RIGGED_ALPHA);
|
||||
if (!mRiggedFace[RIGGED_ALPHA].empty())
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
|
||||
gGL.setColorMask(true, true);
|
||||
gGL.blendFunc(LLRender::BF_SOURCE_ALPHA,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA,
|
||||
LLRender::BF_ZERO,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
|
||||
|
||||
renderRigged(avatar, RIGGED_ALPHA);
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)
|
||||
{
|
||||
renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
|
||||
if (!mRiggedFace[RIGGED_FULLBRIGHT_ALPHA].empty())
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
|
||||
gGL.setColorMask(true, true);
|
||||
gGL.blendFunc(LLRender::BF_SOURCE_ALPHA,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA,
|
||||
LLRender::BF_ZERO,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
|
||||
|
||||
renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderRiggedGlow(LLVOAvatar* avatar)
|
||||
{
|
||||
renderRigged(avatar, RIGGED_GLOW, true);
|
||||
if (!mRiggedFace[RIGGED_GLOW].empty())
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
LLGLDisable test(GL_ALPHA_TEST);
|
||||
gGL.flush();
|
||||
|
||||
LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
|
||||
glPolygonOffset(-1.0f, -1.0f);
|
||||
gGL.setSceneBlendType(LLRender::BT_ADD);
|
||||
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
|
||||
gGL.setColorMask(false, true);
|
||||
|
||||
renderRigged(avatar, RIGGED_GLOW, true);
|
||||
|
||||
gGL.setColorMask(true, false);
|
||||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -847,12 +847,12 @@ void LLDrawPoolBump::renderDeferred(S32 pass)
|
|||
LLFastTimer ftm(FTM_RENDER_BUMP);
|
||||
|
||||
U32 type = LLRenderPass::PASS_BUMP;
|
||||
LLCullResult::drawinfo_list_t::iterator begin = gPipeline.beginRenderMap(type);
|
||||
LLCullResult::drawinfo_list_t::iterator end = gPipeline.endRenderMap(type);
|
||||
LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type);
|
||||
LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type);
|
||||
|
||||
U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_BINORMAL | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_COLOR;
|
||||
|
||||
for (LLCullResult::drawinfo_list_t::iterator i = begin; i != end; ++i)
|
||||
for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)
|
||||
{
|
||||
LLDrawInfo& params = **i;
|
||||
|
||||
|
|
@ -1448,10 +1448,10 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
|
|||
|
||||
void LLDrawPoolBump::renderBump(U32 type, U32 mask)
|
||||
{
|
||||
LLCullResult::drawinfo_list_t::iterator begin = gPipeline.beginRenderMap(type);
|
||||
LLCullResult::drawinfo_list_t::iterator end = gPipeline.endRenderMap(type);
|
||||
LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type);
|
||||
LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type);
|
||||
|
||||
for (LLCullResult::drawinfo_list_t::iterator i = begin; i != end; ++i)
|
||||
for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)
|
||||
{
|
||||
LLDrawInfo& params = **i;
|
||||
|
||||
|
|
|
|||
|
|
@ -4069,7 +4069,7 @@ public:
|
|||
{
|
||||
if (index < 255)
|
||||
{
|
||||
if (facep->mDrawInfo->mTextureList.size() <= index)
|
||||
if (facep->mDrawInfo->mTextureList.size()<= index)
|
||||
{
|
||||
llerrs << "Face texture index out of bounds." << llendl;
|
||||
}
|
||||
|
|
@ -4581,28 +4581,62 @@ LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage)
|
|||
|
||||
LLCullResult::LLCullResult()
|
||||
{
|
||||
mVisibleGroupsAllocated = 0;
|
||||
mAlphaGroupsAllocated = 0;
|
||||
mOcclusionGroupsAllocated = 0;
|
||||
mDrawableGroupsAllocated = 0;
|
||||
mVisibleListAllocated = 0;
|
||||
mVisibleBridgeAllocated = 0;
|
||||
|
||||
mVisibleGroups = NULL;
|
||||
mVisibleGroupsEnd = NULL;
|
||||
mAlphaGroups = NULL;
|
||||
mAlphaGroupsEnd = NULL;
|
||||
mOcclusionGroups = NULL;
|
||||
mOcclusionGroupsEnd = NULL;
|
||||
mDrawableGroups = NULL;
|
||||
mDrawableGroupsEnd = NULL;
|
||||
mVisibleList = NULL;
|
||||
mVisibleListEnd = NULL;
|
||||
mVisibleBridge = NULL;
|
||||
mVisibleBridgeEnd = NULL;
|
||||
|
||||
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
|
||||
{
|
||||
mRenderMap[i] = NULL;
|
||||
mRenderMapEnd[i] = NULL;
|
||||
mRenderMapAllocated[i] = NULL;
|
||||
}
|
||||
|
||||
clear();
|
||||
}
|
||||
|
||||
void LLCullResult::pushBack(void**& head, U32& count, void* val)
|
||||
{
|
||||
count++;
|
||||
head = (void**) realloc((void*) head, sizeof(void*) * count);
|
||||
head[count-1] = val;
|
||||
}
|
||||
|
||||
void LLCullResult::clear()
|
||||
{
|
||||
mVisibleGroupsSize = 0;
|
||||
mVisibleGroupsEnd = mVisibleGroups.begin();
|
||||
mVisibleGroupsEnd = mVisibleGroups;
|
||||
|
||||
mAlphaGroupsSize = 0;
|
||||
mAlphaGroupsEnd = mAlphaGroups.begin();
|
||||
mAlphaGroupsEnd = mAlphaGroups;
|
||||
|
||||
mOcclusionGroupsSize = 0;
|
||||
mOcclusionGroupsEnd = mOcclusionGroups.begin();
|
||||
mOcclusionGroupsEnd = mOcclusionGroups;
|
||||
|
||||
mDrawableGroupsSize = 0;
|
||||
mDrawableGroupsEnd = mDrawableGroups.begin();
|
||||
mDrawableGroupsEnd = mDrawableGroups;
|
||||
|
||||
mVisibleListSize = 0;
|
||||
mVisibleListEnd = mVisibleList.begin();
|
||||
mVisibleListEnd = mVisibleList;
|
||||
|
||||
mVisibleBridgeSize = 0;
|
||||
mVisibleBridgeEnd = mVisibleBridge.begin();
|
||||
mVisibleBridgeEnd = mVisibleBridge;
|
||||
|
||||
|
||||
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
|
||||
|
|
@ -4612,176 +4646,176 @@ void LLCullResult::clear()
|
|||
mRenderMap[i][j] = 0;
|
||||
}
|
||||
mRenderMapSize[i] = 0;
|
||||
mRenderMapEnd[i] = mRenderMap[i].begin();
|
||||
mRenderMapEnd[i] = mRenderMap[i];
|
||||
}
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::beginVisibleGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::beginVisibleGroups()
|
||||
{
|
||||
return mVisibleGroups.begin();
|
||||
return mVisibleGroups;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::endVisibleGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::endVisibleGroups()
|
||||
{
|
||||
return mVisibleGroupsEnd;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::beginAlphaGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::beginAlphaGroups()
|
||||
{
|
||||
return mAlphaGroups.begin();
|
||||
return mAlphaGroups;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::endAlphaGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::endAlphaGroups()
|
||||
{
|
||||
return mAlphaGroupsEnd;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::beginOcclusionGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::beginOcclusionGroups()
|
||||
{
|
||||
return mOcclusionGroups.begin();
|
||||
return mOcclusionGroups;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::endOcclusionGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::endOcclusionGroups()
|
||||
{
|
||||
return mOcclusionGroupsEnd;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::beginDrawableGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::beginDrawableGroups()
|
||||
{
|
||||
return mDrawableGroups.begin();
|
||||
return mDrawableGroups;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::endDrawableGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::endDrawableGroups()
|
||||
{
|
||||
return mDrawableGroupsEnd;
|
||||
}
|
||||
|
||||
LLCullResult::drawable_list_t::iterator LLCullResult::beginVisibleList()
|
||||
LLCullResult::drawable_iterator LLCullResult::beginVisibleList()
|
||||
{
|
||||
return mVisibleList.begin();
|
||||
return mVisibleList;
|
||||
}
|
||||
|
||||
LLCullResult::drawable_list_t::iterator LLCullResult::endVisibleList()
|
||||
LLCullResult::drawable_iterator LLCullResult::endVisibleList()
|
||||
{
|
||||
return mVisibleListEnd;
|
||||
}
|
||||
|
||||
LLCullResult::bridge_list_t::iterator LLCullResult::beginVisibleBridge()
|
||||
LLCullResult::bridge_iterator LLCullResult::beginVisibleBridge()
|
||||
{
|
||||
return mVisibleBridge.begin();
|
||||
return mVisibleBridge;
|
||||
}
|
||||
|
||||
LLCullResult::bridge_list_t::iterator LLCullResult::endVisibleBridge()
|
||||
LLCullResult::bridge_iterator LLCullResult::endVisibleBridge()
|
||||
{
|
||||
return mVisibleBridgeEnd;
|
||||
}
|
||||
|
||||
LLCullResult::drawinfo_list_t::iterator LLCullResult::beginRenderMap(U32 type)
|
||||
LLCullResult::drawinfo_iterator LLCullResult::beginRenderMap(U32 type)
|
||||
{
|
||||
return mRenderMap[type].begin();
|
||||
return mRenderMap[type];
|
||||
}
|
||||
|
||||
LLCullResult::drawinfo_list_t::iterator LLCullResult::endRenderMap(U32 type)
|
||||
LLCullResult::drawinfo_iterator LLCullResult::endRenderMap(U32 type)
|
||||
{
|
||||
return mRenderMapEnd[type];
|
||||
}
|
||||
|
||||
void LLCullResult::pushVisibleGroup(LLSpatialGroup* group)
|
||||
{
|
||||
if (mVisibleGroupsSize < mVisibleGroups.size())
|
||||
if (mVisibleGroupsSize < mVisibleGroupsAllocated)
|
||||
{
|
||||
mVisibleGroups[mVisibleGroupsSize] = group;
|
||||
}
|
||||
else
|
||||
{
|
||||
mVisibleGroups.push_back(group);
|
||||
pushBack((void**&) mVisibleGroups, mVisibleGroupsAllocated, (void*) group);
|
||||
}
|
||||
++mVisibleGroupsSize;
|
||||
mVisibleGroupsEnd = mVisibleGroups.begin()+mVisibleGroupsSize;
|
||||
mVisibleGroupsEnd = mVisibleGroups+mVisibleGroupsSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushAlphaGroup(LLSpatialGroup* group)
|
||||
{
|
||||
if (mAlphaGroupsSize < mAlphaGroups.size())
|
||||
if (mAlphaGroupsSize < mAlphaGroupsAllocated)
|
||||
{
|
||||
mAlphaGroups[mAlphaGroupsSize] = group;
|
||||
}
|
||||
else
|
||||
{
|
||||
mAlphaGroups.push_back(group);
|
||||
pushBack((void**&) mAlphaGroups, mAlphaGroupsAllocated, (void*) group);
|
||||
}
|
||||
++mAlphaGroupsSize;
|
||||
mAlphaGroupsEnd = mAlphaGroups.begin()+mAlphaGroupsSize;
|
||||
mAlphaGroupsEnd = mAlphaGroups+mAlphaGroupsSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group)
|
||||
{
|
||||
if (mOcclusionGroupsSize < mOcclusionGroups.size())
|
||||
if (mOcclusionGroupsSize < mOcclusionGroupsAllocated)
|
||||
{
|
||||
mOcclusionGroups[mOcclusionGroupsSize] = group;
|
||||
}
|
||||
else
|
||||
{
|
||||
mOcclusionGroups.push_back(group);
|
||||
pushBack((void**&) mOcclusionGroups, mOcclusionGroupsAllocated, (void*) group);
|
||||
}
|
||||
++mOcclusionGroupsSize;
|
||||
mOcclusionGroupsEnd = mOcclusionGroups.begin()+mOcclusionGroupsSize;
|
||||
mOcclusionGroupsEnd = mOcclusionGroups+mOcclusionGroupsSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushDrawableGroup(LLSpatialGroup* group)
|
||||
{
|
||||
if (mDrawableGroupsSize < mDrawableGroups.size())
|
||||
if (mDrawableGroupsSize < mDrawableGroupsAllocated)
|
||||
{
|
||||
mDrawableGroups[mDrawableGroupsSize] = group;
|
||||
}
|
||||
else
|
||||
{
|
||||
mDrawableGroups.push_back(group);
|
||||
pushBack((void**&) mDrawableGroups, mDrawableGroupsAllocated, (void*) group);
|
||||
}
|
||||
++mDrawableGroupsSize;
|
||||
mDrawableGroupsEnd = mDrawableGroups.begin()+mDrawableGroupsSize;
|
||||
mDrawableGroupsEnd = mDrawableGroups+mDrawableGroupsSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushDrawable(LLDrawable* drawable)
|
||||
{
|
||||
if (mVisibleListSize < mVisibleList.size())
|
||||
if (mVisibleListSize < mVisibleListAllocated)
|
||||
{
|
||||
mVisibleList[mVisibleListSize] = drawable;
|
||||
}
|
||||
else
|
||||
{
|
||||
mVisibleList.push_back(drawable);
|
||||
pushBack((void**&) mVisibleList, mVisibleListAllocated, (void*) drawable);
|
||||
}
|
||||
++mVisibleListSize;
|
||||
mVisibleListEnd = mVisibleList.begin()+mVisibleListSize;
|
||||
mVisibleListEnd = mVisibleList+mVisibleListSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushBridge(LLSpatialBridge* bridge)
|
||||
{
|
||||
if (mVisibleBridgeSize < mVisibleBridge.size())
|
||||
if (mVisibleBridgeSize < mVisibleBridgeAllocated)
|
||||
{
|
||||
mVisibleBridge[mVisibleBridgeSize] = bridge;
|
||||
}
|
||||
else
|
||||
{
|
||||
mVisibleBridge.push_back(bridge);
|
||||
pushBack((void**&) mVisibleBridge, mVisibleBridgeAllocated, (void*) bridge);
|
||||
}
|
||||
++mVisibleBridgeSize;
|
||||
mVisibleBridgeEnd = mVisibleBridge.begin()+mVisibleBridgeSize;
|
||||
mVisibleBridgeEnd = mVisibleBridge+mVisibleBridgeSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)
|
||||
{
|
||||
if (mRenderMapSize[type] < mRenderMap[type].size())
|
||||
if (mRenderMapSize[type] < mRenderMapAllocated[type])
|
||||
{
|
||||
mRenderMap[type][mRenderMapSize[type]] = draw_info;
|
||||
}
|
||||
else
|
||||
{
|
||||
mRenderMap[type].push_back(draw_info);
|
||||
pushBack((void**&) mRenderMap[type], mRenderMapAllocated[type], (void*) draw_info);
|
||||
}
|
||||
++mRenderMapSize[type];
|
||||
mRenderMapEnd[type] = mRenderMap[type].begin() + mRenderMapSize[type];
|
||||
mRenderMapEnd[type] = mRenderMap[type] + mRenderMapSize[type];
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -542,34 +542,39 @@ class LLCullResult
|
|||
public:
|
||||
LLCullResult();
|
||||
|
||||
typedef std::vector<LLSpatialGroup*> sg_list_t;
|
||||
typedef std::vector<LLDrawable*> drawable_list_t;
|
||||
typedef std::vector<LLSpatialBridge*> bridge_list_t;
|
||||
typedef std::vector<LLDrawInfo*> drawinfo_list_t;
|
||||
typedef LLSpatialGroup** sg_list_t;
|
||||
typedef LLDrawable** drawable_list_t;
|
||||
typedef LLSpatialBridge** bridge_list_t;
|
||||
typedef LLDrawInfo** drawinfo_list_t;
|
||||
|
||||
typedef LLSpatialGroup** sg_iterator;
|
||||
typedef LLSpatialBridge** bridge_iterator;
|
||||
typedef LLDrawInfo** drawinfo_iterator;
|
||||
typedef LLDrawable** drawable_iterator;
|
||||
|
||||
void clear();
|
||||
|
||||
sg_list_t::iterator beginVisibleGroups();
|
||||
sg_list_t::iterator endVisibleGroups();
|
||||
sg_iterator beginVisibleGroups();
|
||||
sg_iterator endVisibleGroups();
|
||||
|
||||
sg_list_t::iterator beginAlphaGroups();
|
||||
sg_list_t::iterator endAlphaGroups();
|
||||
sg_iterator beginAlphaGroups();
|
||||
sg_iterator endAlphaGroups();
|
||||
|
||||
bool hasOcclusionGroups() { return mOcclusionGroupsSize > 0; }
|
||||
sg_list_t::iterator beginOcclusionGroups();
|
||||
sg_list_t::iterator endOcclusionGroups();
|
||||
sg_iterator beginOcclusionGroups();
|
||||
sg_iterator endOcclusionGroups();
|
||||
|
||||
sg_list_t::iterator beginDrawableGroups();
|
||||
sg_list_t::iterator endDrawableGroups();
|
||||
sg_iterator beginDrawableGroups();
|
||||
sg_iterator endDrawableGroups();
|
||||
|
||||
drawable_list_t::iterator beginVisibleList();
|
||||
drawable_list_t::iterator endVisibleList();
|
||||
drawable_iterator beginVisibleList();
|
||||
drawable_iterator endVisibleList();
|
||||
|
||||
bridge_list_t::iterator beginVisibleBridge();
|
||||
bridge_list_t::iterator endVisibleBridge();
|
||||
bridge_iterator beginVisibleBridge();
|
||||
bridge_iterator endVisibleBridge();
|
||||
|
||||
drawinfo_list_t::iterator beginRenderMap(U32 type);
|
||||
drawinfo_list_t::iterator endRenderMap(U32 type);
|
||||
drawinfo_iterator beginRenderMap(U32 type);
|
||||
drawinfo_iterator endRenderMap(U32 type);
|
||||
|
||||
void pushVisibleGroup(LLSpatialGroup* group);
|
||||
void pushAlphaGroup(LLSpatialGroup* group);
|
||||
|
|
@ -589,28 +594,41 @@ public:
|
|||
void assertDrawMapsEmpty();
|
||||
|
||||
private:
|
||||
|
||||
void pushBack(void** &head, U32& count, void* val);
|
||||
|
||||
U32 mVisibleGroupsSize;
|
||||
U32 mAlphaGroupsSize;
|
||||
U32 mOcclusionGroupsSize;
|
||||
U32 mDrawableGroupsSize;
|
||||
U32 mVisibleListSize;
|
||||
U32 mVisibleBridgeSize;
|
||||
|
||||
U32 mVisibleGroupsAllocated;
|
||||
U32 mAlphaGroupsAllocated;
|
||||
U32 mOcclusionGroupsAllocated;
|
||||
U32 mDrawableGroupsAllocated;
|
||||
U32 mVisibleListAllocated;
|
||||
U32 mVisibleBridgeAllocated;
|
||||
|
||||
U32 mRenderMapSize[LLRenderPass::NUM_RENDER_TYPES];
|
||||
|
||||
sg_list_t mVisibleGroups;
|
||||
sg_list_t::iterator mVisibleGroupsEnd;
|
||||
sg_iterator mVisibleGroupsEnd;
|
||||
sg_list_t mAlphaGroups;
|
||||
sg_list_t::iterator mAlphaGroupsEnd;
|
||||
sg_iterator mAlphaGroupsEnd;
|
||||
sg_list_t mOcclusionGroups;
|
||||
sg_list_t::iterator mOcclusionGroupsEnd;
|
||||
sg_iterator mOcclusionGroupsEnd;
|
||||
sg_list_t mDrawableGroups;
|
||||
sg_list_t::iterator mDrawableGroupsEnd;
|
||||
sg_iterator mDrawableGroupsEnd;
|
||||
drawable_list_t mVisibleList;
|
||||
drawable_list_t::iterator mVisibleListEnd;
|
||||
drawable_iterator mVisibleListEnd;
|
||||
bridge_list_t mVisibleBridge;
|
||||
bridge_list_t::iterator mVisibleBridgeEnd;
|
||||
bridge_iterator mVisibleBridgeEnd;
|
||||
drawinfo_list_t mRenderMap[LLRenderPass::NUM_RENDER_TYPES];
|
||||
drawinfo_list_t::iterator mRenderMapEnd[LLRenderPass::NUM_RENDER_TYPES];
|
||||
U32 mRenderMapAllocated[LLRenderPass::NUM_RENDER_TYPES];
|
||||
drawinfo_iterator mRenderMapEnd[LLRenderPass::NUM_RENDER_TYPES];
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2306,7 +2306,7 @@ S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid)
|
|||
}
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Update Avatar");
|
||||
static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Avatar Update");
|
||||
static LLFastTimer::DeclareTimer FTM_JOINT_UPDATE("Update Joints");
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -1981,25 +1981,25 @@ void LLPipeline::checkReferences(LLFace* face)
|
|||
#if 0
|
||||
if (sCull)
|
||||
{
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
check_references(group, face);
|
||||
}
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
check_references(group, face);
|
||||
}
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
check_references(group, face);
|
||||
}
|
||||
|
||||
for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList(); iter != sCull->endVisibleList(); ++iter)
|
||||
for (LLCullResult::drawable_iterator iter = sCull->beginVisibleList(); iter != sCull->endVisibleList(); ++iter)
|
||||
{
|
||||
LLDrawable* drawable = *iter;
|
||||
check_references(drawable, face);
|
||||
|
|
@ -2013,25 +2013,25 @@ void LLPipeline::checkReferences(LLDrawable* drawable)
|
|||
#if 0
|
||||
if (sCull)
|
||||
{
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
check_references(group, drawable);
|
||||
}
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
check_references(group, drawable);
|
||||
}
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
check_references(group, drawable);
|
||||
}
|
||||
|
||||
for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList(); iter != sCull->endVisibleList(); ++iter)
|
||||
for (LLCullResult::drawable_iterator iter = sCull->beginVisibleList(); iter != sCull->endVisibleList(); ++iter)
|
||||
{
|
||||
if (drawable == *iter)
|
||||
{
|
||||
|
|
@ -2064,19 +2064,19 @@ void LLPipeline::checkReferences(LLDrawInfo* draw_info)
|
|||
#if 0
|
||||
if (sCull)
|
||||
{
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
check_references(group, draw_info);
|
||||
}
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
check_references(group, draw_info);
|
||||
}
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
check_references(group, draw_info);
|
||||
|
|
@ -2090,7 +2090,7 @@ void LLPipeline::checkReferences(LLSpatialGroup* group)
|
|||
#if 0
|
||||
if (sCull)
|
||||
{
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
|
||||
{
|
||||
if (group == *iter)
|
||||
{
|
||||
|
|
@ -2098,7 +2098,7 @@ void LLPipeline::checkReferences(LLSpatialGroup* group)
|
|||
}
|
||||
}
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
|
||||
{
|
||||
if (group == *iter)
|
||||
{
|
||||
|
|
@ -2106,7 +2106,7 @@ void LLPipeline::checkReferences(LLSpatialGroup* group)
|
|||
}
|
||||
}
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
|
||||
{
|
||||
if (group == *iter)
|
||||
{
|
||||
|
|
@ -2448,7 +2448,7 @@ void LLPipeline::doOcclusion(LLCamera& camera)
|
|||
}
|
||||
mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
group->doOcclusion(&camera);
|
||||
|
|
@ -2962,7 +2962,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
|
|||
//LLVertexBuffer::unbind();
|
||||
|
||||
grabReferences(result);
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
group->checkOcclusion();
|
||||
|
|
@ -2988,9 +2988,9 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
|
|||
if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
|
||||
{
|
||||
LLSpatialGroup* last_group = NULL;
|
||||
for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
|
||||
for (LLCullResult::bridge_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
|
||||
{
|
||||
LLCullResult::bridge_list_t::iterator cur_iter = i;
|
||||
LLCullResult::bridge_iterator cur_iter = i;
|
||||
LLSpatialBridge* bridge = *cur_iter;
|
||||
LLSpatialGroup* group = bridge->getSpatialGroup();
|
||||
|
||||
|
|
@ -3020,7 +3020,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
|
|||
}
|
||||
}
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
|
||||
for (LLCullResult::sg_iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
group->checkOcclusion();
|
||||
|
|
@ -3042,7 +3042,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
|
|||
|
||||
{
|
||||
LLFastTimer ftm(FTM_STATESORT_DRAWABLE);
|
||||
for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList();
|
||||
for (LLCullResult::drawable_iterator iter = sCull->beginVisibleList();
|
||||
iter != sCull->endVisibleList(); ++iter)
|
||||
{
|
||||
LLDrawable *drawablep = *iter;
|
||||
|
|
@ -3178,11 +3178,11 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
|
|||
}
|
||||
|
||||
|
||||
void forAllDrawables(LLCullResult::sg_list_t::iterator begin,
|
||||
LLCullResult::sg_list_t::iterator end,
|
||||
void forAllDrawables(LLCullResult::sg_iterator begin,
|
||||
LLCullResult::sg_iterator end,
|
||||
void (*func)(LLDrawable*))
|
||||
{
|
||||
for (LLCullResult::sg_list_t::iterator i = begin; i != end; ++i)
|
||||
for (LLCullResult::sg_iterator i = begin; i != end; ++i)
|
||||
{
|
||||
for (LLSpatialGroup::element_iter j = (*i)->getData().begin(); j != (*i)->getData().end(); ++j)
|
||||
{
|
||||
|
|
@ -3386,7 +3386,7 @@ void LLPipeline::postSort(LLCamera& camera)
|
|||
|
||||
llpushcallstacks ;
|
||||
//rebuild drawable geometry
|
||||
for (LLCullResult::sg_list_t::iterator i = sCull->beginDrawableGroups(); i != sCull->endDrawableGroups(); ++i)
|
||||
for (LLCullResult::sg_iterator i = sCull->beginDrawableGroups(); i != sCull->endDrawableGroups(); ++i)
|
||||
{
|
||||
LLSpatialGroup* group = *i;
|
||||
if (!sUseOcclusion ||
|
||||
|
|
@ -3404,7 +3404,7 @@ void LLPipeline::postSort(LLCamera& camera)
|
|||
|
||||
|
||||
//build render map
|
||||
for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
|
||||
for (LLCullResult::sg_iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
|
||||
{
|
||||
LLSpatialGroup* group = *i;
|
||||
if (sUseOcclusion &&
|
||||
|
|
@ -4425,7 +4425,7 @@ void LLPipeline::renderPhysicsDisplay()
|
|||
}
|
||||
}
|
||||
|
||||
for (LLCullResult::bridge_list_t::const_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
|
||||
for (LLCullResult::bridge_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
|
||||
{
|
||||
LLSpatialBridge* bridge = *i;
|
||||
if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
|
||||
|
|
@ -4520,7 +4520,7 @@ void LLPipeline::renderDebug()
|
|||
}
|
||||
}
|
||||
|
||||
for (LLCullResult::bridge_list_t::const_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
|
||||
for (LLCullResult::bridge_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
|
||||
{
|
||||
LLSpatialBridge* bridge = *i;
|
||||
if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
|
||||
|
|
@ -9509,7 +9509,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
|
|||
|
||||
void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture)
|
||||
{
|
||||
for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
|
||||
for (LLCullResult::sg_iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
|
||||
{
|
||||
LLSpatialGroup* group = *i;
|
||||
if (!group->isDead() &&
|
||||
|
|
@ -9773,22 +9773,22 @@ BOOL LLPipeline::hasRenderBatches(const U32 type) const
|
|||
return sCull->getRenderMapSize(type) > 0;
|
||||
}
|
||||
|
||||
LLCullResult::drawinfo_list_t::iterator LLPipeline::beginRenderMap(U32 type)
|
||||
LLCullResult::drawinfo_iterator LLPipeline::beginRenderMap(U32 type)
|
||||
{
|
||||
return sCull->beginRenderMap(type);
|
||||
}
|
||||
|
||||
LLCullResult::drawinfo_list_t::iterator LLPipeline::endRenderMap(U32 type)
|
||||
LLCullResult::drawinfo_iterator LLPipeline::endRenderMap(U32 type)
|
||||
{
|
||||
return sCull->endRenderMap(type);
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLPipeline::beginAlphaGroups()
|
||||
LLCullResult::sg_iterator LLPipeline::beginAlphaGroups()
|
||||
{
|
||||
return sCull->beginAlphaGroups();
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLPipeline::endAlphaGroups()
|
||||
LLCullResult::sg_iterator LLPipeline::endAlphaGroups()
|
||||
{
|
||||
return sCull->endAlphaGroups();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -292,10 +292,10 @@ public:
|
|||
void setLight(LLDrawable *drawablep, BOOL is_light);
|
||||
|
||||
BOOL hasRenderBatches(const U32 type) const;
|
||||
LLCullResult::drawinfo_list_t::iterator beginRenderMap(U32 type);
|
||||
LLCullResult::drawinfo_list_t::iterator endRenderMap(U32 type);
|
||||
LLCullResult::sg_list_t::iterator beginAlphaGroups();
|
||||
LLCullResult::sg_list_t::iterator endAlphaGroups();
|
||||
LLCullResult::drawinfo_iterator beginRenderMap(U32 type);
|
||||
LLCullResult::drawinfo_iterator endRenderMap(U32 type);
|
||||
LLCullResult::sg_iterator beginAlphaGroups();
|
||||
LLCullResult::sg_iterator endAlphaGroups();
|
||||
|
||||
|
||||
void addTrianglesDrawn(S32 index_count, U32 render_type = LLRender::TRIANGLES);
|
||||
|
|
|
|||
Loading…
Reference in New Issue