Skip to content
Snippets Groups Projects
Commit ab31e3bb authored by Tofu Linden's avatar Tofu Linden
Browse files

Fix up the SSE stuff so it compiles on Linux. Though I don't think it actually works properly.

parent cd13bc0e
No related branches found
No related tags found
No related merge requests found
...@@ -73,25 +73,6 @@ void LLMemory::freeReserve() ...@@ -73,25 +73,6 @@ void LLMemory::freeReserve()
reserveMem = NULL; reserveMem = NULL;
} }
void* ll_allocate (size_t size)
{
if (size == 0)
{
llwarns << "Null allocation" << llendl;
}
void *p = malloc(size);
if (p == NULL)
{
LLMemory::freeReserve();
llerrs << "Out of memory Error" << llendl;
}
return p;
}
void ll_release (void *p)
{
free(p);
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
......
...@@ -32,14 +32,33 @@ ...@@ -32,14 +32,33 @@
#ifndef LLMEMORY_H #ifndef LLMEMORY_H
#define LLMEMORY_H #define LLMEMORY_H
#include <stdlib.h>
inline void* ll_aligned_malloc(size_t size, size_t alignment = 16) // alignment MUST be power-of-two multiple of sizeof(void*). returned hunk MUST be freed with ll_aligned_free().
{
#if defined(LL_WINDOWS)
return _mm_malloc(size, alignment);
#else
void *rtn;
if (LL_LIKELY(0 == posix_memalign(&rtn, alignment, size)))
{
return rtn;
}
else // bad alignment requested, or out of memory
{
return NULL;
}
#endif
}
extern S32 gTotalDAlloc; inline void ll_aligned_free(void *p)
extern S32 gTotalDAUse; {
extern S32 gDACount; #if defined(LL_WINDOWS)
_mm_free(p);
extern void* ll_allocate (size_t size); #else
extern void ll_release (void *p); free(p); // posix_memalign() is compatible with heap deallocator
#endif
}
class LL_COMMON_API LLMemory class LL_COMMON_API LLMemory
{ {
......
...@@ -35,7 +35,8 @@ ...@@ -35,7 +35,8 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "llviewerprecompiledheaders.h" #include "llviewerprecompiledheaders.h"
#include "llpolymesh.h" #include "llfasttimer.h"
#include "llmemory.h"
#include "llviewercontrol.h" #include "llviewercontrol.h"
#include "llxmltree.h" #include "llxmltree.h"
...@@ -45,7 +46,7 @@ ...@@ -45,7 +46,7 @@
#include "llvolume.h" #include "llvolume.h"
#include "llendianswizzle.h" #include "llendianswizzle.h"
#include "llfasttimer.h" #include "llpolymesh.h"
#define HEADER_ASCII "Linden Mesh 1.0" #define HEADER_ASCII "Linden Mesh 1.0"
#define HEADER_BINARY "Linden Binary Mesh 1.0" #define HEADER_BINARY "Linden Binary Mesh 1.0"
...@@ -715,7 +716,7 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_ ...@@ -715,7 +716,7 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_
int nfloats = nverts * (2*4 + 3*3 + 2 + 4); int nfloats = nverts * (2*4 + 3*3 + 2 + 4);
//use aligned vertex data to make LLPolyMesh SSE friendly //use aligned vertex data to make LLPolyMesh SSE friendly
mVertexData = (F32*) _mm_malloc(nfloats*4, 16); mVertexData = (F32*) ll_aligned_malloc(nfloats*4, 16);
int offset = 0; int offset = 0;
mCoords = (LLVector4*)(mVertexData + offset); offset += 4*nverts; mCoords = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
mNormals = (LLVector4*)(mVertexData + offset); offset += 4*nverts; mNormals = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
...@@ -759,7 +760,7 @@ LLPolyMesh::~LLPolyMesh() ...@@ -759,7 +760,7 @@ LLPolyMesh::~LLPolyMesh()
delete [] mClothingWeights; delete [] mClothingWeights;
delete [] mTexCoords; delete [] mTexCoords;
#else #else
_mm_free(mVertexData); ll_aligned_free(mVertexData);
#endif #endif
} }
......
...@@ -94,8 +94,8 @@ void LLViewerJointMesh::updateGeometrySSE(LLFace *face, LLPolyMesh *mesh) ...@@ -94,8 +94,8 @@ void LLViewerJointMesh::updateGeometrySSE(LLFace *face, LLPolyMesh *mesh)
buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset); buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset);
const F32* weights = mesh->getWeights(); const F32* weights = mesh->getWeights();
const LLVector3* coords = mesh->getCoords(); const LLVector3* coords = (const LLVector3*)mesh->getCoords();
const LLVector3* normals = mesh->getNormals(); const LLVector3* normals = (const LLVector3*)mesh->getNormals();
for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index) for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index)
{ {
if( weight != weights[index]) if( weight != weights[index])
......
...@@ -101,8 +101,8 @@ void LLViewerJointMesh::updateGeometrySSE2(LLFace *face, LLPolyMesh *mesh) ...@@ -101,8 +101,8 @@ void LLViewerJointMesh::updateGeometrySSE2(LLFace *face, LLPolyMesh *mesh)
buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset); buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset);
const F32* weights = mesh->getWeights(); const F32* weights = mesh->getWeights();
const LLVector3* coords = mesh->getCoords(); const LLVector3* coords = (const LLVector3*)mesh->getCoords();
const LLVector3* normals = mesh->getNormals(); const LLVector3* normals = (const LLVector3*)mesh->getNormals();
for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index) for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index)
{ {
if( weight != weights[index]) if( weight != weights[index])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment