More should-be-safe changes. Prep for pipeline work.

This commit is contained in:
Shyotl
2011-05-18 16:04:46 -05:00
parent 0193173e46
commit a4b7bbd031
8 changed files with 103 additions and 46 deletions

View File

@@ -68,6 +68,17 @@ const U32 SILHOUETTE_HIGHLIGHT = 0;
class LLDrawable : public LLRefCount
{
public:
LLDrawable(const LLDrawable& rhs)
{
*this = rhs;
}
const LLDrawable& operator=(const LLDrawable& rhs)
{
llerrs << "Illegal operation!" << llendl;
return *this;
}
static void initClass();
LLDrawable() { init(); }
@@ -103,7 +114,7 @@ public:
const LLQuaternion& getRotation() const { return mXform.getRotation(); }
F32 getIntensity() const { return llmin(mXform.getScale().mV[0], 4.f); }
S32 getLOD() const { return mVObjp ? mVObjp->getLOD() : 1; }
F64 getBinRadius() const { return mBinRadius; }
F32 getBinRadius() const { return mBinRadius; }
void getMinMax(LLVector3& min,LLVector3& max) const { mXform.getMinMax(min,max); }
LLXformMatrix* getXform() { return &mXform; }
@@ -301,9 +312,9 @@ private:
F32 mRadius;
LLVector3 mExtents[2];
LLVector3d mPositionGroup;
F64 mBinRadius;
F32 mBinRadius;
S32 mGeneration;
LLVector3 mCurrentScale;
static U32 sCurVisible; // Counter for what value of mVisible means currently visible

View File

@@ -198,7 +198,10 @@ void LLDrawPoolAlpha::render(S32 pass)
simple_shader->bind();
pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask());
}
fullbright_shader->bind();
if (fullbright_shader)
{
fullbright_shader->bind();
}
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask());
LLGLSLShader::bindNoShader();
}
@@ -238,7 +241,7 @@ void LLDrawPoolAlpha::render(S32 pass)
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
glColor4f(1,0,0,1);
LLViewerFetchedTexture::sSmokeImagep->addTextureStats(1024.f*1024.f);
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep.get(), TRUE);
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep, TRUE) ;
renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_TEXCOORD0);
}

View File

@@ -228,6 +228,11 @@ void LLFace::setWorldMatrix(const LLMatrix4 &mat)
llerrs << "Faces on this drawable are not independently modifiable\n" << llendl;
}
void LLFace::setPool(LLFacePool* pool)
{
mDrawPoolp = pool;
}
void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep)
{
LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
@@ -329,8 +334,13 @@ void LLFace::setDrawable(LLDrawable *drawable)
mXform = &drawable->mXform;
}
void LLFace::setSize(const S32 num_vertices, const S32 num_indices)
void LLFace::setSize(S32 num_vertices, const S32 num_indices, bool align)
{
if (align)
{
//allocate vertices in blocks of 4 for alignment
num_vertices = (num_vertices + 0x3) & ~0x3;
}
if (mGeomCount != num_vertices ||
mIndicesCount != num_indices)
{
@@ -339,6 +349,8 @@ void LLFace::setSize(const S32 num_vertices, const S32 num_indices)
mVertexBuffer = NULL;
mLastVertexBuffer = NULL;
}
llassert(verify());
}
//============================================================================
@@ -952,6 +964,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,
const U16 &index_offset)
{
llassert(verify());
const LLVolumeFace &vf = volume.getVolumeFace(f);
S32 num_vertices = (S32)vf.mVertices.size();
S32 num_indices = (S32)vf.mIndices.size();
@@ -1678,3 +1691,16 @@ LLViewerTexture* LLFace::getTexture() const
{
return mTexture ;
}
void LLFace::setVertexBuffer(LLVertexBuffer* buffer)
{
mVertexBuffer = buffer;
llassert(verify());
}
void LLFace::clearVertexBuffer()
{
mVertexBuffer = NULL;
mLastVertexBuffer = NULL;
}

View File

@@ -392,7 +392,7 @@ void LLSpatialGroup::checkStates()
void validate_draw_info(LLDrawInfo& params)
{
#if LL_OCTREE_PARANOIA_CHECK
if (params.mVertexBuffer.isNull())
if (!params.mVertexBuffer)
{
llerrs << "Draw batch has no vertex buffer." << llendl;
}
@@ -1309,8 +1309,7 @@ void LLSpatialGroup::destroyGL()
for (S32 j = 0; j < drawable->getNumFaces(); j++)
{
LLFace* facep = drawable->getFace(j);
facep->mVertexBuffer = NULL;
facep->mLastVertexBuffer = NULL;
facep->clearVertexBuffer();
}
}
}
@@ -1519,7 +1518,6 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32
mSlopRatio = 0.25f;
mInfiniteFarClip = FALSE;
LLGLNamePool::registerPool(&sQueryPool);
mOctree = new LLSpatialGroup::OctreeRoot(LLVector3d(0,0,0),
LLVector3d(1,1,1),
@@ -1934,6 +1932,8 @@ public:
void drawBox(const LLVector3& c, const LLVector3& r)
{
LLVertexBuffer::unbind();
gGL.begin(LLRender::TRIANGLE_STRIP);
//left front
gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,-1))).mV);
@@ -2179,7 +2179,7 @@ void pushVerts(LLSpatialGroup* group, U32 mask)
void pushVerts(LLFace* face, U32 mask)
{
LLVertexBuffer* buffer = face->mVertexBuffer;
LLVertexBuffer* buffer = face->getVertexBuffer();
if (buffer)
{
@@ -2309,7 +2309,7 @@ void renderOctree(LLSpatialGroup* group)
for (S32 j = 0; j < drawable->getNumFaces(); j++)
{
LLFace* face = drawable->getFace(j);
if (face->mVertexBuffer.notNull())
if (face->getVertexBuffer())
{
if (gFrameTimeSeconds - face->mLastUpdateTime < 0.5f)
{
@@ -2324,10 +2324,10 @@ void renderOctree(LLSpatialGroup* group)
continue;
}
face->mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX);
face->getVertexBuffer()->setBuffer(LLVertexBuffer::MAP_VERTEX);
//drawBox((face->mExtents[0] + face->mExtents[1])*0.5f,
// (face->mExtents[1]-face->mExtents[0])*0.5f);
face->mVertexBuffer->draw(LLRender::TRIANGLES, face->getIndicesCount(), face->getIndicesStart());
face->getVertexBuffer()->draw(LLRender::TRIANGLES, face->getIndicesCount(), face->getIndicesStart());
}
}

View File

@@ -162,6 +162,7 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)
mReservedAttribs.push_back("materialColor");
mReservedAttribs.push_back("specularColor");
mReservedAttribs.push_back("binormal");
mReservedAttribs.push_back("object_weight");
mAvatarAttribs.reserve(5);
mAvatarAttribs.push_back("weight");
@@ -566,7 +567,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
// (in order of shader function call depth for reference purposes, deepest level first)
shaders.clear();
shaders.reserve(12);
shaders.reserve(13);
shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
shaders.push_back( make_pair( "windlight/gammaF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT]) );
shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );

View File

@@ -82,6 +82,7 @@ public:
MATERIAL_COLOR = 0,
SPECULAR_COLOR,
BINORMAL,
OBJECT_WEIGHT,
END_RESERVED_ATTRIBS
} eGLSLReservedAttribs;

View File

@@ -1272,6 +1272,17 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
regenFaces();
}
genBBoxes(FALSE);
if (mSculptChanged)
{ //changes in sculpt maps can thrash an object bounding box without
//triggering a spatial group bounding box update -- force spatial group
//to update bounding boxes
LLSpatialGroup* group = mDrawable->getSpatialGroup();
if (group)
{
group->unbound();
}
}
}
}
}
@@ -2347,7 +2358,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
(type == LLRenderPass::PASS_INVISIBLE) ||
(type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT));
if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL))
if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_NORMAL))
{
llwarns << "Non fullbright face has no normals!" << llendl;
return;
@@ -2383,13 +2394,13 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
glow = (U8) (facep->getTextureEntry()->getGlow() * 255);
}
if (facep->mVertexBuffer.isNull())
if (!facep->getVertexBuffer())
{
llerrs << "WTF?" << llendl;
}
if (idx >= 0 &&
draw_vec[idx]->mVertexBuffer == facep->mVertexBuffer &&
draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() &&
draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
(LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex) &&
#if LL_DARWIN
@@ -2416,7 +2427,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
U32 offset = facep->getIndicesStart();
U32 count = facep->getIndicesCount();
LLPointer<LLDrawInfo> draw_info = new LLDrawInfo(start,end,count,offset,tex,
facep->mVertexBuffer, fullbright, bump);
facep->getVertexBuffer(), fullbright, bump);
draw_info->mGroup = group;
draw_info->mVSize = facep->getVirtualSize();
draw_vec.push_back(draw_info);
@@ -2513,20 +2524,23 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
//for each face
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
LLFace* facep = drawablep->getFace(i);
//ALWAYS null out vertex buffer on rebuild -- if the face lands in a render
// batch, it will recover its vertex buffer reference from the spatial group
facep->setVertexBuffer(NULL);
//sum up face verts and indices
drawablep->updateFaceSize(i);
LLFace* facep = drawablep->getFace(i);
if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0)
{
facep->mVertexBuffer = NULL;
facep->mLastVertexBuffer = NULL;
facep->clearVertexBuffer();
continue;
}
cur_total += facep->getGeomCount();
if (facep->hasGeometry() && facep->mPixelArea > FORCE_CULL_AREA)
if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
{
const LLTextureEntry* te = facep->getTextureEntry();
LLViewerTexture* tex = facep->getTexture();
@@ -2539,7 +2553,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
}
BOOL force_simple = (facep->mPixelArea < FORCE_SIMPLE_RENDER_AREA);
BOOL force_simple = (facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA);
U32 type = gPipeline.getPoolTypeFromTE(te, tex);
if (type != LLDrawPool::POOL_ALPHA && force_simple)
{
@@ -2625,8 +2639,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{ //face has no renderable geometry
facep->mVertexBuffer = NULL;
facep->mLastVertexBuffer = NULL;
facep->clearVertexBuffer();
}
}
}
@@ -2697,7 +2710,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
{
LLFace* face = drawablep->getFace(i);
if (face && face->mVertexBuffer.notNull())
if (face && face->getVertexBuffer())
{
face->getGeometryVolume(*volume, face->getTEOffset(),
vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
@@ -2748,9 +2761,10 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
{
LLFace* face = drawablep->getFace(i);
if (face && face->mVertexBuffer.notNull() && face->mVertexBuffer->isLocked())
LLVertexBuffer* buff = face ? face->getVertexBuffer() : NULL;
if (buff && buff->isLocked())
{
face->mVertexBuffer->setBuffer(0) ;
buff->setBuffer(0) ;
}
}
}
@@ -2852,14 +2866,13 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
else
{
if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage)
{ //resize pre-existing buffer
if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage ||
buffer->getTypeMask() != mask)
{
//Using group->mSpatialPartition->mVertexDataMask may be dropping MAP_BINORMAL on RENDER_BUMP...
buffer = createVertexBuffer(mask /*group->mSpatialPartition->mVertexDataMask*/,
buffer = createVertexBuffer(mask,
group->mBufferUsage);
buffer->allocateBuffer(geom_count, index_count, TRUE);
llassert_always(buffer->getTypeMask() == mask);
}
else
{
@@ -2875,11 +2888,12 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
U16 index_offset = 0;
while (face_iter < i)
{
{ //update face indices for new buffer
facep = *face_iter;
facep->mIndicesIndex = indices_index;
facep->mGeomIndex = index_offset;
facep->mVertexBuffer = buffer;
facep->setIndicesIndex(indices_index);
facep->setGeomIndex(index_offset);
facep->setVertexBuffer(buffer);
{
facep->updateRebuildFlags();
if (!LLPipeline::sDelayVBUpdate)
@@ -2900,9 +2914,12 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
index_offset += facep->getGeomCount();
indices_index += facep->mIndicesCount;
indices_index += facep->getIndicesCount();
BOOL force_simple = facep->mPixelArea < FORCE_SIMPLE_RENDER_AREA;
//append face to appropriate render batch
BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA;
BOOL fullbright = facep->isState(LLFace::FULLBRIGHT);
if ((mask & LLVertexBuffer::MAP_NORMAL) == 0)
{ //paranoia check to make sure GL doesn't try to read non-existant normals
@@ -3071,7 +3088,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
//sum up face verts and indices
drawablep->updateFaceSize(i);
LLFace* facep = drawablep->getFace(i);
if (facep->hasGeometry() && facep->mPixelArea > FORCE_CULL_AREA)
if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
{
vertex_count += facep->getGeomCount();
index_count += facep->getIndicesCount();
@@ -3081,8 +3098,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
}
else
{
facep->mVertexBuffer = NULL;
facep->mLastVertexBuffer = NULL;
facep->clearVertexBuffer();
}
}
}

View File

@@ -636,7 +636,7 @@ void LLPipeline::releaseGLBuffers()
mWaterRef.release();
mWaterDis.release();
mScreen.release();
mSampleBuffer.releaseSampleBuffer();
mSampleBuffer.release();
mDeferredScreen.release();
mDeferredDepth.release();
for (U32 i = 0; i < 3; i++)
@@ -5303,8 +5303,7 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
for (S32 i = 0; i < drawable->getNumFaces(); i++)
{
LLFace* facep = drawable->getFace(i);
facep->mVertexBuffer = NULL;
facep->mLastVertexBuffer = NULL;
facep->clearVertexBuffer();
}
}