summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Cook <james@lindenlab.com>2007-07-11 21:10:53 +0000
committerJames Cook <james@lindenlab.com>2007-07-11 21:10:53 +0000
commita6769f262ff910949a7e1c81cf98e52ddfc2d44a (patch)
tree636700d8e2b4a040d39cfd5daa8e890660a8ec37
parent873b83c2424524845c19339a08d7fd5e0f1ae805 (diff)
SL-47720 Crash on startup due to SSE instructions. Disable SSE code generation on Windows build. This prevents global constants from being initialized with SSE instructions. We can use the SSE code on Intel Mac (since they all support SSE) and if we enable SSE compilation for the entire Windows viewer. Reviewed by Kelly.
-rw-r--r--indra/llmath/llv4math.h22
-rw-r--r--indra/newview/llviewerjointmesh_sse.cpp13
-rw-r--r--indra/newview/llviewerjointmesh_sse2.cpp14
-rw-r--r--indra/newview/llviewerjointmesh_vec.cpp17
4 files changed, 43 insertions, 23 deletions
diff --git a/indra/llmath/llv4math.h b/indra/llmath/llv4math.h
index 4a299716b1..f064b39947 100644
--- a/indra/llmath/llv4math.h
+++ b/indra/llmath/llv4math.h
@@ -9,6 +9,25 @@
#ifndef LL_LLV4MATH_H
#define LL_LLV4MATH_H
+// *NOTE: We do not support SSE acceleration on Windows builds.
+// Our minimum specification for the viewer includes 1 GHz Athlon processors,
+// which covers the Athlon Thunderbird series that does not support SSE.
+//
+// Our header files include statements like this
+// const F32 HAVOK_TIMESTEP = 1.f / 45.f;
+// This creates "globals" that are included in each .obj file. If a single
+// .cpp file has SSE code generation turned on (eg, llviewerjointmesh_sse.cpp)
+// these globals will be initialized using SSE instructions. This causes SL
+// to crash before main() on processors without SSE. Untangling all these
+// headers/variables is too much work for the small performance gains of
+// vectorization.
+//
+// Therefore we only support vectorization on builds where the everything is
+// built with SSE or Altivec. See https://jira.secondlife.com/browse/VWR-1610
+// and https://jira.lindenlab.com/browse/SL-47720 for details.
+//
+// Sorry the code is such a mess. JC
+
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// LLV4MATH - GNUC
@@ -46,6 +65,9 @@ typedef float V4F32 __attribute__((vector_size(16)));
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
+// Only vectorize if the entire Windows build uses SSE.
+// _M_IX86_FP is set when SSE code generation is turned on, and I have
+// confirmed this in VS2003, VS2003 SP1, and VS2005. JC
#if LL_MSVC && _M_IX86_FP
#define LL_VECTORIZE 1
diff --git a/indra/newview/llviewerjointmesh_sse.cpp b/indra/newview/llviewerjointmesh_sse.cpp
index c4f8ff4fa8..579c5d2687 100644
--- a/indra/newview/llviewerjointmesh_sse.cpp
+++ b/indra/newview/llviewerjointmesh_sse.cpp
@@ -1,6 +1,9 @@
/**
- * @file llviewerjointmesh.cpp
- * @brief LLV4 class implementation with LLViewerJointMesh class
+ * @file llviewerjointmesh_sse.cpp
+ * @brief SSE vectorized joint skinning code, only used when video card does
+ * not support avatar vertex programs.
+ *
+ * *NOTE: Disabled on Windows builds. See llv4math.h for details.
*
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
* $License$
@@ -10,9 +13,7 @@
// Header Files
//-----------------------------------------------------------------------------
-// Do not use precompiled headers, because we need to build this file with
-// SSE support, but not the precompiled header file. JC
-#include "linden_common.h"
+#include "llviewerprecompiledheaders.h"
#include "llviewerjointmesh.h"
@@ -27,7 +28,6 @@
#include "llv4matrix4.h"
#include "v3math.h"
-// *NOTE: SSE must be enabled for this module
#if LL_VECTORIZE
@@ -88,7 +88,6 @@ void LLViewerJointMesh::updateGeometrySSE(LLFace *face, LLPolyMesh *mesh)
void LLViewerJointMesh::updateGeometrySSE(LLFace *face, LLPolyMesh *mesh)
{
LLViewerJointMesh::updateGeometryVectorized(face, mesh);
- return;
}
#endif
diff --git a/indra/newview/llviewerjointmesh_sse2.cpp b/indra/newview/llviewerjointmesh_sse2.cpp
index cae602ac14..9ef2b4692a 100644
--- a/indra/newview/llviewerjointmesh_sse2.cpp
+++ b/indra/newview/llviewerjointmesh_sse2.cpp
@@ -1,6 +1,9 @@
/**
- * @file llviewerjointmesh.cpp
- * @brief LLV4 class implementation with LLViewerJointMesh class
+ * @file llviewerjointmesh_sse2.cpp
+ * @brief SSE vectorized joint skinning code, only used when video card does
+ * not support avatar vertex programs.
+ *
+ * *NOTE: Disabled on Windows builds. See llv4math.h for details.
*
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
* $License$
@@ -10,9 +13,7 @@
// Header Files
//-----------------------------------------------------------------------------
-// Do not use precompiled headers, because we need to build this file with
-// SSE support, but not the precompiled header file. JC
-#include "linden_common.h"
+#include "llviewerprecompiledheaders.h"
#include "llviewerjointmesh.h"
@@ -29,10 +30,10 @@
#include "m4math.h"
#include "v3math.h"
-// *NOTE: SSE2 must be enabled for this module
#if LL_VECTORIZE
+
static LLV4Matrix4 sJointMat[32];
inline void matrix_translate(LLV4Matrix4& m, const LLMatrix4* w, const LLVector3& j)
@@ -90,7 +91,6 @@ void LLViewerJointMesh::updateGeometrySSE2(LLFace *face, LLPolyMesh *mesh)
void LLViewerJointMesh::updateGeometrySSE2(LLFace *face, LLPolyMesh *mesh)
{
LLViewerJointMesh::updateGeometryVectorized(face, mesh);
- return;
}
#endif
diff --git a/indra/newview/llviewerjointmesh_vec.cpp b/indra/newview/llviewerjointmesh_vec.cpp
index adc602bdaf..69ddad63fc 100644
--- a/indra/newview/llviewerjointmesh_vec.cpp
+++ b/indra/newview/llviewerjointmesh_vec.cpp
@@ -1,8 +1,11 @@
/**
- * @file llviewerjointmesh.cpp
- * @brief LLV4 math class implementation with LLViewerJointMesh class
+ * @file llviewerjointmesh_vec.cpp
+ * @brief Compiler-generated vectorized joint skinning code, works well on
+ * Altivec processors (PowerPC Mac)
*
- * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
+ * *NOTE: See llv4math.h for notes on SSE/Altivec vector code.
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
* $License$
*/
@@ -19,12 +22,8 @@
#include "llv4matrix3.h"
#include "llv4matrix4.h"
-// *NOTE: This is the fallback code for vectorized joint mesh skinning.
-// For builds that must support non-SSE x86 code (Windows, perhaps Linux)
-// SSE code generation should be disabled for this file.
-//
-// For builds that run on processors that always have SSE (Mac),
-// SSE code generation can be enabled. JC
+// Generic vectorized code, uses compiler defaults, works well for Altivec
+// on PowerPC.
static LLV4Matrix4 sJointMat[32];