Make some use of new vertex buffer checks

master
Ansariel 2017-11-12 13:57:52 +01:00
parent c606bc3492
commit 66a7a9b7a6
4 changed files with 194 additions and 98 deletions

View File

@ -1127,7 +1127,11 @@ void LLRender::shutdown()
void LLRender::initVB()
{
mBuffer = new LLVertexBuffer(immediate_mask, 0);
mBuffer->allocateBuffer(4096, 0, TRUE);
if (!mBuffer->allocateBuffer(4096, 0, true))
{
// If this doesn't work, we're knee-deep in trouble!
LL_WARNS() << "Failed to allocate Vertex Buffer for common rendering" << LL_ENDL;
}
mBuffer->getVertexStrider(mVerticesp);
mBuffer->getTexCoord0Strider(mTexcoordsp);
mBuffer->getColorStrider(mColorsp);

View File

@ -611,30 +611,64 @@ void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, con
//LLGLSLShader::startProfile();
//glDrawArrays(sGLMode[mode], 0, count);
//LLGLSLShader::stopProfile(count, mode);
bool has_buffer = true;
if (!sUtilityBuffer)
{
sUtilityBuffer = new LLVertexBuffer(MAP_VERTEX | MAP_NORMAL | MAP_TEXCOORD0, GL_STREAM_DRAW);
sUtilityBuffer->allocateBuffer(count, count, true);
has_buffer = sUtilityBuffer->allocateBuffer(count, count, true);
}
if (sUtilityBuffer->getNumVerts() < (S32) count)
{
sUtilityBuffer->resizeBuffer(count, count);
has_buffer = sUtilityBuffer->resizeBuffer(count, count);
}
LLStrider<LLVector3> vertex_strider;
LLStrider<LLVector3> normal_strider;
sUtilityBuffer->getVertexStrider(vertex_strider);
sUtilityBuffer->getNormalStrider(normal_strider);
for (U32 i = 0; i < count; ++i)
if (has_buffer)
{
*(vertex_strider++) = pos[i];
*(normal_strider++) = norm[i];
}
LLStrider<LLVector3> vertex_strider;
LLStrider<LLVector3> normal_strider;
sUtilityBuffer->getVertexStrider(vertex_strider);
sUtilityBuffer->getNormalStrider(normal_strider);
for (U32 i = 0; i < count; ++i)
{
*(vertex_strider++) = pos[i];
*(normal_strider++) = norm[i];
}
sUtilityBuffer->setBuffer(MAP_VERTEX | MAP_NORMAL);
LLGLSLShader::startProfile();
sUtilityBuffer->drawArrays(mode, 0, pos.size());
LLGLSLShader::stopProfile(count, mode);
sUtilityBuffer->setBuffer(MAP_VERTEX | MAP_NORMAL);
LLGLSLShader::startProfile();
sUtilityBuffer->drawArrays(mode, 0, pos.size());
LLGLSLShader::stopProfile(count, mode);
}
else
{
unbind();
setupClientArrays(MAP_VERTEX | MAP_NORMAL);
LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
if (shader)
{
S32 loc = LLVertexBuffer::TYPE_VERTEX;
if (loc > -1)
{
glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, 0, pos[0].mV);
}
loc = LLVertexBuffer::TYPE_NORMAL;
if (loc > -1)
{
glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, 0, norm[0].mV);
}
}
else
{
glVertexPointer(3, GL_FLOAT, 0, pos[0].mV);
glNormalPointer(GL_FLOAT, 0, norm[0].mV);
}
LLGLSLShader::startProfile();
glDrawArrays(sGLMode[mode], 0, count);
LLGLSLShader::stopProfile(count, mode);
}
// </FS:Ansariel>
}
@ -663,36 +697,43 @@ void LLVertexBuffer::drawElements(U32 mode, const S32 num_vertices, const LLVect
gGL.syncMatrices();
// <FS:Ansariel> Use a vbo for the static LLVertexBuffer::drawArray/Element functions; by Drake Arconis/Shyotl Kuhr
bool has_buffer = true;
if (!sUtilityBuffer)
{
sUtilityBuffer = new LLVertexBuffer(MAP_VERTEX | MAP_NORMAL | MAP_TEXCOORD0, GL_STREAM_DRAW);
sUtilityBuffer->allocateBuffer(num_vertices, num_indices, true);
has_buffer = sUtilityBuffer->allocateBuffer(num_vertices, num_indices, true);
}
if (sUtilityBuffer->getNumVerts() < num_vertices || sUtilityBuffer->getNumIndices() < num_indices)
{
sUtilityBuffer->resizeBuffer(llmax(sUtilityBuffer->getNumVerts(), num_vertices), llmax(sUtilityBuffer->getNumIndices(), num_indices));
has_buffer = sUtilityBuffer->resizeBuffer(llmax(sUtilityBuffer->getNumVerts(), num_vertices), llmax(sUtilityBuffer->getNumIndices(), num_indices));
}
// </FS:Ansariel>
U32 mask = LLVertexBuffer::MAP_VERTEX;
// <FS:Ansariel> Use a vbo for the static LLVertexBuffer::drawArray/Element functions; by Drake Arconis/Shyotl Kuhr
LLStrider<U16> index_strider;
LLStrider<LLVector3> vertex_strider;
sUtilityBuffer->getIndexStrider(index_strider);
sUtilityBuffer->getVertexStrider(vertex_strider);
const S32 index_size = ((num_indices * sizeof(U16)) + 0xF) & ~0xF;
const S32 vertex_size = ((num_vertices * 4 * sizeof(F32)) + 0xF) & ~0xF;
LLVector4a::memcpyNonAliased16((F32*)index_strider.get(), (F32*)indicesp, index_size);
LLVector4a::memcpyNonAliased16((F32*)vertex_strider.get(), (F32*)pos, vertex_size);
if (has_buffer)
{
LLStrider<U16> index_strider;
LLStrider<LLVector3> vertex_strider;
sUtilityBuffer->getIndexStrider(index_strider);
sUtilityBuffer->getVertexStrider(vertex_strider);
const S32 index_size = ((num_indices * sizeof(U16)) + 0xF) & ~0xF;
const S32 vertex_size = ((num_vertices * 4 * sizeof(F32)) + 0xF) & ~0xF;
LLVector4a::memcpyNonAliased16((F32*)index_strider.get(), (F32*)indicesp, index_size);
LLVector4a::memcpyNonAliased16((F32*)vertex_strider.get(), (F32*)pos, vertex_size);
}
// </FS:Ansariel>
if (tc)
{
mask = mask | LLVertexBuffer::MAP_TEXCOORD0;
// <FS:Ansariel> Use a vbo for the static LLVertexBuffer::drawArray/Element functions; by Drake Arconis/Shyotl Kuhr
LLStrider<LLVector2> tc_strider;
sUtilityBuffer->getTexCoord0Strider(tc_strider);
const S32 tc_size = ((num_vertices * 2 * sizeof(F32)) + 0xF) & ~0xF;
LLVector4a::memcpyNonAliased16((F32*)tc_strider.get(), (F32*)tc, tc_size);
if (has_buffer)
{
LLStrider<LLVector2> tc_strider;
sUtilityBuffer->getTexCoord0Strider(tc_strider);
const S32 tc_size = ((num_vertices * 2 * sizeof(F32)) + 0xF) & ~0xF;
LLVector4a::memcpyNonAliased16((F32*)tc_strider.get(), (F32*)tc, tc_size);
}
// </FS:Ansariel>
}
@ -721,10 +762,40 @@ void LLVertexBuffer::drawElements(U32 mode, const S32 num_vertices, const LLVect
//LLGLSLShader::startProfile();
//glDrawElements(sGLMode[mode], num_indices, GL_UNSIGNED_SHORT, indicesp);
//LLGLSLShader::stopProfile(num_indices, mode);
sUtilityBuffer->setBuffer(mask);
LLGLSLShader::startProfile();
sUtilityBuffer->draw(mode, num_indices, 0);
LLGLSLShader::stopProfile(num_indices, mode);
if (has_buffer)
{
sUtilityBuffer->setBuffer(mask);
LLGLSLShader::startProfile();
sUtilityBuffer->draw(mode, num_indices, 0);
LLGLSLShader::stopProfile(num_indices, mode);
}
else
{
unbind();
setupClientArrays(mask);
if (LLGLSLShader::sNoFixedFunction)
{
S32 loc = LLVertexBuffer::TYPE_VERTEX;
glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, 16, pos);
if (tc)
{
loc = LLVertexBuffer::TYPE_TEXCOORD0;
glVertexAttribPointerARB(loc, 2, GL_FLOAT, GL_FALSE, 0, tc);
}
}
else
{
glTexCoordPointer(2, GL_FLOAT, 0, tc);
glVertexPointer(3, GL_FLOAT, 16, pos);
}
LLGLSLShader::startProfile();
glDrawElements(sGLMode[mode], num_indices, GL_UNSIGNED_SHORT, indicesp);
LLGLSLShader::stopProfile(num_indices, mode);
}
// </FS:Ansariel>
}

View File

@ -31,33 +31,20 @@ LLVector3 exoPostProcess::sExodusRenderVignette;
exoPostProcess::exoPostProcess()
{
mExoPostBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1, 0);
mExoPostBuffer->allocateBuffer(8, 0, true);
LLStrider<LLVector3> vert;
mExoPostBuffer->getVertexStrider(vert);
LLStrider<LLVector2> tc0;
LLStrider<LLVector2> tc1;
mExoPostBuffer->getTexCoord0Strider(tc0);
mExoPostBuffer->getTexCoord1Strider(tc1);
vert[0].set(-1.f, 1.f, 0.f);
vert[1].set(-1.f, -3.f, 0.f);
vert[2].set(3.f,1.f, 0.f);
initVB();
sExodusRenderVignette = LLVector3(0.f, 0.f, 0.f);
}
exoPostProcess::~exoPostProcess()
{
mExoPostBuffer = NULL;
destroyVB();
}
void exoPostProcess::ExodusRenderPostStack(LLRenderTarget *src, LLRenderTarget *dst)
{
if (mVertexShaderLevel > 0)
{
if (sExodusRenderVignette.mV[0] > 0 && LLPipeline::sRenderDeferred)
if (sExodusRenderVignette.mV[0] > 0.f && LLPipeline::sRenderDeferred)
ExodusRenderVignette(src, dst); // Don't render vignette here in non-deferred. Do it in the glow combine shader.
}
}
@ -76,51 +63,61 @@ void exoPostProcess::ExodusRenderPostUpdate()
void exoPostProcess::initVB()
{
destroyVB();
mExoPostBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1, 0);
if (!gPipeline.sRenderDeferred)
{
// Destroy our old buffer, and create a new vertex buffer for the screen (shamelessly ganked from pipeline.cpp).
destroyVB();
mExoPostBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1, 0);
mExoPostBuffer->allocateBuffer(3,0,TRUE);
if (mExoPostBuffer->allocateBuffer(3, 0, true))
{
LLStrider<LLVector3> v;
LLStrider<LLVector2> uv1;
LLStrider<LLVector2> uv2;
LLStrider<LLVector3> v;
LLStrider<LLVector2> uv1;
LLStrider<LLVector2> uv2;
mExoPostBuffer->getVertexStrider(v);
mExoPostBuffer->getTexCoord0Strider(uv1);
mExoPostBuffer->getTexCoord1Strider(uv2);
uv1[0] = LLVector2(0.f, 0.f);
uv1[1] = LLVector2(0.f, 2.f);
uv1[2] = LLVector2(2.f, 0.f);
uv2[0] = LLVector2(0.f, 0.f);
uv2[1] = LLVector2(0.f, etc2.mV[1] * 2.f);
uv2[2] = LLVector2(etc2.mV[0] * 2.f, 0.f);
v[0] = LLVector3(-1.f, -1.f, 0.f);
v[1] = LLVector3(-1.f, 3.f, 0.f);
v[2] = LLVector3(3.f, -1.f, 0.f);
mExoPostBuffer->getVertexStrider(v);
mExoPostBuffer->getTexCoord0Strider(uv1);
mExoPostBuffer->getTexCoord1Strider(uv2);
uv1[0] = LLVector2(0.f, 0.f);
uv1[1] = LLVector2(0.f, 2.f);
uv1[2] = LLVector2(2.f, 0.f);
uv2[0] = LLVector2(0.f, 0.f);
uv2[1] = LLVector2(0.f, etc2.mV[1] * 2.f);
uv2[2] = LLVector2(etc2.mV[0] * 2.f, 0.f);
v[0] = LLVector3(-1.f, -1.f, 0.f);
v[1] = LLVector3(-1.f, 3.f, 0.f);
v[2] = LLVector3(3.f, -1.f, 0.f);
mExoPostBuffer->flush();
mExoPostBuffer->flush();
}
else
{
LL_WARNS() << "Failed to allocate Vertex Buffer for exoPostProcessing" << LL_ENDL;
destroyVB();
}
}
else
{
destroyVB();
mExoPostBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1, 0);
mExoPostBuffer->allocateBuffer(8, 0, true);
if (mExoPostBuffer->allocateBuffer(8, 0, true))
{
LLStrider<LLVector3> vert;
mExoPostBuffer->getVertexStrider(vert);
LLStrider<LLVector2> tc0;
LLStrider<LLVector2> tc1;
mExoPostBuffer->getTexCoord0Strider(tc0);
mExoPostBuffer->getTexCoord1Strider(tc1);
LLStrider<LLVector3> vert;
mExoPostBuffer->getVertexStrider(vert);
LLStrider<LLVector2> tc0;
LLStrider<LLVector2> tc1;
mExoPostBuffer->getTexCoord0Strider(tc0);
mExoPostBuffer->getTexCoord1Strider(tc1);
vert[0].set(-1.f, 1.f, 0.f);
vert[1].set(-1.f, -3.f, 0.f);
vert[2].set(3.f, 1.f, 0.f);
vert[0].set(-1.f, 1.f, 0.f);
vert[1].set(-1.f, -3.f, 0.f);
vert[2].set(3.f, 1.f, 0.f);
}
else
{
LL_WARNS() << "Failed to allocate Vertex Buffer for exoPostProcessing" << LL_ENDL;
destroyVB();
}
}
}
@ -139,20 +136,23 @@ void exoPostProcess::ExodusRenderPost(LLRenderTarget* src, LLRenderTarget* dst,
void exoPostProcess::ExodusRenderVignette(LLRenderTarget* src, LLRenderTarget* dst)
{
dst->bindTarget();
LLGLSLShader *shader = &gPostVignetteProgram;
shader->bind();
if (mExoPostBuffer)
{
dst->bindTarget();
LLGLSLShader *shader = &gPostVignetteProgram;
shader->bind();
mExoPostBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX);
mExoPostBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX);
exoShader::BindRenderTarget(dst, shader, LLShaderMgr::EXO_RENDER_SCREEN);
exoShader::BindRenderTarget(dst, shader, LLShaderMgr::EXO_RENDER_SCREEN);
shader->uniform3fv(LLShaderMgr::EXO_RENDER_VIGNETTE, 1, sExodusRenderVignette.mV);
mExoPostBuffer->drawArrays(LLRender::TRIANGLES, 0, 3);
stop_glerror();
shader->uniform3fv(LLShaderMgr::EXO_RENDER_VIGNETTE, 1, sExodusRenderVignette.mV);
mExoPostBuffer->drawArrays(LLRender::TRIANGLES, 0, 3);
stop_glerror();
shader->unbind();
dst->flush();
shader->unbind();
dst->flush();
}
}
void exoShader::BindTex2D(LLTexture *tex2D, LLGLSLShader *shader, S32 uniform, S32 unit, LLTexUnit::eTextureType mode, LLTexUnit::eTextureAddressMode addressMode, LLTexUnit::eTextureFilterOptions filterMode)

View File

@ -12161,7 +12161,11 @@ void LLPipeline::disableDeferredOnLowMemory()
void LLPipeline::initDeferredVB()
{
mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK, 0);
mDeferredVB->allocateBuffer(8, 0, true);
if (!mDeferredVB->allocateBuffer(8, 0, true))
{
// Most likely going to crash...
LL_WARNS() << "Failed to allocate Vertex Buffer for deferred rendering" << LL_ENDL;
}
}
// </FS:Ansariel>
@ -12169,7 +12173,12 @@ void LLPipeline::initDeferredVB()
void LLPipeline::initAuxiliaryVB()
{
mAuxiliaryVB = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR, 0);
mAuxiliaryVB->allocateBuffer(3, 0, true);
if (!mAuxiliaryVB->allocateBuffer(3, 0, true))
{
LL_WARNS() << "Failed to allocate auxiliary Vertex Buffer" << LL_ENDL;
mAuxiliaryVB = NULL;
return;
}
LLStrider<LLVector3> verts;
mAuxiliaryVB->getVertexStrider(verts);
@ -12180,12 +12189,20 @@ void LLPipeline::initAuxiliaryVB()
void LLPipeline::drawAuxiliaryVB(U32 mask /*= 0*/)
{
if (!mAuxiliaryVB)
{
return;
}
mAuxiliaryVB->setBuffer(LLVertexBuffer::MAP_VERTEX | mask);
mAuxiliaryVB->drawArrays(LLRender::TRIANGLES, 0, 3);
}
void LLPipeline::drawAuxiliaryVB(const LLVector2& tc1, const LLVector2& tc2, U32 mask /*= 0*/)
{
if (!mAuxiliaryVB)
{
return;
}
LLStrider<LLVector2> tc;
mAuxiliaryVB->getTexCoord0Strider(tc);
tc[0].set(tc1.mV[0], tc1.mV[1]);
@ -12197,6 +12214,10 @@ void LLPipeline::drawAuxiliaryVB(const LLVector2& tc1, const LLVector2& tc2, U32
void LLPipeline::drawAuxiliaryVB(const LLVector2& tc1, const LLVector2& tc2, const LLColor4& color)
{
if (!mAuxiliaryVB)
{
return;
}
LLStrider<LLColor4U> col;
mAuxiliaryVB->getColorStrider(col);
col[0].set(color);