diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index d697b95dd..6062abcf4 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -40,7 +40,7 @@ #include "llglheaders.h" #include "llmemtype.h" #include "llrender.h" - +#include "llvector4a.h" #include "llcontrol.h" //============================================================================ @@ -488,6 +488,8 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) : mTypeMask = typemask; mStride = stride; + mAlignedOffset = 0; + mAlignedIndexOffset = 0; sCount++; } @@ -619,8 +621,8 @@ void LLVertexBuffer::createGLBuffer() else { static int gl_buffer_idx = 0; - mGLBuffer = ++gl_buffer_idx; - mMappedData = new U8[size]; + mGLBuffer = ++gl_buffer_idx; + mMappedData = (U8*) ll_aligned_malloc_16(size); if(!sOmitBlank) memset((void*)mMappedData, 0, size); } } @@ -642,15 +644,20 @@ void LLVertexBuffer::createGLIndices() mEmpty = TRUE; + //pad by 16 bytes for aligned copies + size += 16; + if (useVBOs()) { + //pad by another 16 bytes for VBO pointer adjustment + size += 16; mMappedIndexData = NULL; genIndices(); mResized = TRUE; } else { - mMappedIndexData = new U8[size]; + mMappedIndexData = (U8*) ll_aligned_malloc_16(size); if(!sOmitBlank) memset((void*)mMappedIndexData, 0, size); static int gl_buffer_idx = 0; mGLIndices = ++gl_buffer_idx; @@ -674,7 +681,7 @@ void LLVertexBuffer::destroyGLBuffer() } else { - delete [] mMappedData; + ll_aligned_free_16((void*)mMappedData); mMappedData = NULL; mEmpty = TRUE; } @@ -703,7 +710,7 @@ void LLVertexBuffer::destroyGLIndices() } else { - delete [] mMappedIndexData; + ll_aligned_free_16((void*)mMappedIndexData); mMappedIndexData = NULL; mEmpty = TRUE; } @@ -728,7 +735,7 @@ void LLVertexBuffer::updateNumVerts(S32 nverts) } mRequestedNumVerts = nverts; - + if (!mDynamicSize) { mNumVerts = nverts; @@ -779,6 +786,7 @@ void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create) { llerrs << "Bad vertex buffer allocation: " << nverts << " : " << nindices << llendl; } + updateNumVerts(nverts); updateNumIndices(nindices); @@ -840,7 +848,7 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices) if (!useVBOs()) { volatile U8* old = mMappedData; - mMappedData = new U8[newsize]; + mMappedData = (U8*) ll_aligned_malloc_16(newsize); if (old) { memcpy((void*)mMappedData, (void*)old, llmin(newsize, oldsize)); @@ -849,7 +857,7 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices) memset((void*)(mMappedData+oldsize), 0, newsize-oldsize); } - delete [] old; + ll_aligned_free_16((void*)old); } else { @@ -877,7 +885,7 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices) { //delete old buffer, keep GL buffer for now volatile U8* old = mMappedIndexData; - mMappedIndexData = new U8[new_index_size]; + mMappedIndexData = (U8*) ll_aligned_malloc_16(new_index_size); if (old) { @@ -886,7 +894,7 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices) { memset((void*)(mMappedIndexData+old_index_size), 0, new_index_size - old_index_size); } - delete [] old; + ll_aligned_free_16((void*)old); } else { @@ -924,8 +932,8 @@ void LLVertexBuffer::freeClientBuffer() { if(useVBOs() && sDisableVBOMapping && (mMappedData || mMappedIndexData)) { - delete[] mMappedData ; - delete[] mMappedIndexData ; + ll_aligned_free_16((void*)mMappedData) ; + ll_aligned_free_16((void*)mMappedIndexData) ; mMappedData = NULL ; mMappedIndexData = NULL ; } @@ -935,9 +943,8 @@ void LLVertexBuffer::allocateClientVertexBuffer() { if(!mMappedData) { - U32 size = getSize() ; - mMappedData = new U8[size]; - memset((void*)mMappedData, 0, size); + mMappedData = (U8*)ll_aligned_malloc_16(getSize()); + if (!sOmitBlank) memset((void*)mMappedData, 0, getSize()); } } @@ -945,9 +952,8 @@ void LLVertexBuffer::allocateClientIndexBuffer() { if(!mMappedIndexData) { - U32 size = getIndicesSize(); - mMappedIndexData = new U8[size]; - memset((void*)mMappedIndexData, 0, size); + mMappedIndexData = (U8*)ll_aligned_malloc_16(getIndicesSize()); + if (!sOmitBlank) memset((void*)mMappedIndexData, 0, getIndicesSize()); } } @@ -977,7 +983,12 @@ volatile U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access) } else { - mMappedData = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); + U8* src = NULL; + { + src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); + } + mMappedData = LL_NEXT_ALIGNED_ADDRESS(src); + mAlignedOffset = mMappedData - src; } stop_glerror(); } @@ -1049,7 +1060,13 @@ volatile U8* LLVertexBuffer::mapIndexBuffer(S32 access) } else { - mMappedIndexData = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); + U8* src = NULL; + { + src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); + } + + mMappedIndexData = src; //LL_NEXT_ALIGNED_ADDRESS(src); + mAlignedIndexOffset = mMappedIndexData - src; stop_glerror(); } } @@ -1165,29 +1182,30 @@ template struct VertexBufferStrider { if (type == LLVertexBuffer::TYPE_INDEX) { - S32 stride = sizeof(T); + volatile U8* ptr = vbo.mapIndexBuffer(); - if (vbo.mapIndexBuffer() == NULL) + if (ptr == NULL) { llwarns << "mapIndexBuffer failed!" << llendl; return FALSE; } - strider = (T*)(vbo.getMappedIndices() + index*stride); + strider = (T*)(ptr + index*sizeof(T)); strider.setStride(0); return TRUE; } else if (vbo.hasDataType(type)) { S32 stride = vbo.getStride(); + volatile U8* ptr = vbo.mapVertexBuffer(type); - if (vbo.mapVertexBuffer(type) == NULL) + if (ptr == NULL) { llwarns << "mapVertexBuffer failed!" << llendl; return FALSE; } - strider = (T*)(vbo.getMappedData() + vbo.getOffset(type) + index*stride); + strider = (T*)(ptr + vbo.getOffset(type) + index*stride); strider.setStride(stride); return TRUE; } @@ -1466,7 +1484,7 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const { LLMemType mt(LLMemType::MTYPE_VERTEX_DATA); stop_glerror(); - volatile U8* base = useVBOs() ? NULL : mMappedData; + volatile U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData; S32 stride = mStride; if ((data_mask & mTypeMask) != data_mask) diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 76080558c..67e5e6933 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -228,6 +228,8 @@ protected: S32 mRequestedNumVerts; // Number of vertices requested S32 mRequestedNumIndices; // Number of indices requested + ptrdiff_t mAlignedOffset; + ptrdiff_t mAlignedIndexOffset; S32 mStride; U32 mTypeMask; S32 mUsage; // GL usage @@ -272,7 +274,7 @@ public: static S32 sTypeOffsets[TYPE_MAX]; static U32 sGLMode[LLRender::NUM_MODES]; static U32 sGLRenderBuffer; - static U32 sGLRenderIndices; + static U32 sGLRenderIndices; static BOOL sVBOActive; static BOOL sIBOActive; static U32 sLastMask;