Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fall back mul_mat4_vec3 to scalar implementation to attempt crash mitigation #3468

Merged
merged 1 commit into from
Jan 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions indra/llmath/llvector4a.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ class LLRotation;
#include <assert.h>
#include "llpreprocessor.h"
#include "llmemory.h"
#include "glm/vec3.hpp"
#include "glm/vec4.hpp"
#include "glm/gtc/type_ptr.hpp"

///////////////////////////////////
// FIRST TIME USERS PLEASE READ
Expand Down Expand Up @@ -364,6 +367,16 @@ class alignas(16) LLVector4a

inline operator LLQuad() const;

explicit inline operator glm::vec3() const
{
return glm::make_vec3(getF32ptr());
};

explicit inline operator glm::vec4() const
{
return glm::make_vec4(getF32ptr());
};

private:
LLQuad mQ{};
};
Expand Down
51 changes: 51 additions & 0 deletions indra/llmath/v3math.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@
#include "llmath.h"

#include "llsd.h"

#include "glm/vec3.hpp"
#include "glm/vec4.hpp"
#include "glm/gtc/type_ptr.hpp"

class LLVector2;
class LLVector4;
class LLVector4a;
Expand Down Expand Up @@ -66,6 +71,11 @@ class LLVector3
explicit LLVector3(const LLVector4a& vec); // Initializes LLVector4 to (vec[0]. vec[1], vec[2])
explicit LLVector3(const LLSD& sd);

// GLM interop
explicit LLVector3(const glm::vec3& vec); // Initializes LLVector3 to (vec[0]. vec[1], vec[2])
explicit LLVector3(const glm::vec4& vec); // Initializes LLVector3 to (vec[0]. vec[1], vec[2])
explicit inline operator glm::vec3() const; // Initializes glm::vec3 to (vec[0]. vec[1], vec[2])
explicit inline operator glm::vec4() const; // Initializes glm::vec4 to (vec[0]. vec[1], vec[2], 1)

LLSD getValue() const;

Expand All @@ -92,6 +102,8 @@ class LLVector3
inline void set(const F32 *vec); // Sets LLVector3 to vec
const LLVector3& set(const LLVector4 &vec);
const LLVector3& set(const LLVector3d &vec);// Sets LLVector3 to vec
inline void set(const glm::vec4& vec); // Sets LLVector3 to vec
inline void set(const glm::vec3& vec); // Sets LLVector3 to vec

inline void setVec(F32 x, F32 y, F32 z); // deprecated
inline void setVec(const LLVector3 &vec); // deprecated
Expand Down Expand Up @@ -190,6 +202,20 @@ inline LLVector3::LLVector3(const F32 *vec)
mV[VZ] = vec[VZ];
}

inline LLVector3::LLVector3(const glm::vec3& vec)
{
mV[VX] = vec.x;
mV[VY] = vec.y;
mV[VZ] = vec.z;
}

inline LLVector3::LLVector3(const glm::vec4& vec)
{
mV[VX] = vec.x;
mV[VY] = vec.y;
mV[VZ] = vec.z;
}

/*
inline LLVector3::LLVector3(const LLVector3 &copy)
{
Expand Down Expand Up @@ -259,6 +285,20 @@ inline void LLVector3::set(const F32 *vec)
mV[2] = vec[2];
}

inline void LLVector3::set(const glm::vec4& vec)
{
mV[VX] = vec.x;
mV[VY] = vec.y;
mV[VZ] = vec.z;
}

inline void LLVector3::set(const glm::vec3& vec)
{
mV[VX] = vec.x;
mV[VY] = vec.y;
mV[VZ] = vec.z;
}

// deprecated
inline void LLVector3::setVec(F32 x, F32 y, F32 z)
{
Expand Down Expand Up @@ -471,6 +511,17 @@ inline LLVector3 operator-(const LLVector3 &a)
return LLVector3( -a.mV[0], -a.mV[1], -a.mV[2] );
}

inline LLVector3::operator glm::vec3() const
{
// Do not use glm::make_vec3 it can result in a buffer overrun on some platforms due to glm::vec3 being a simd vector internally
return glm::vec3(mV[VX], mV[VY], mV[VZ]);
}

inline LLVector3::operator glm::vec4() const
{
return glm::vec4(mV[VX], mV[VY], mV[VZ], 1.f);
}

inline F32 dist_vec(const LLVector3 &a, const LLVector3 &b)
{
F32 x = a.mV[0] - b.mV[0];
Expand Down
51 changes: 51 additions & 0 deletions indra/llmath/v4math.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@
#include "v3math.h"
#include "v2math.h"

#include "glm/vec3.hpp"
#include "glm/vec4.hpp"
#include "glm/gtc/type_ptr.hpp"

class LLMatrix3;
class LLMatrix4;
class LLQuaternion;
Expand Down Expand Up @@ -73,6 +77,11 @@ class LLVector4
mV[3] = (F32)sd[3].asReal();
}

// GLM interop
explicit LLVector4(const glm::vec3& vec); // Initializes LLVector4 to (vec, 1)
explicit LLVector4(const glm::vec4& vec); // Initializes LLVector4 to vec
explicit operator glm::vec3() const; // Initializes glm::vec3 to (vec[0]. vec[1], vec[2])
explicit operator glm::vec4() const; // Initializes glm::vec4 to (vec[0]. vec[1], vec[2], vec[3])

inline bool isFinite() const; // checks to see if all values of LLVector3 are finite

Expand All @@ -85,6 +94,8 @@ class LLVector4
inline void set(const LLVector4 &vec); // Sets LLVector4 to vec
inline void set(const LLVector3 &vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec
inline void set(const F32 *vec); // Sets LLVector4 to vec
inline void set(const glm::vec4& vec); // Sets LLVector4 to vec
inline void set(const glm::vec3& vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec with w defaulted to 1

inline void setVec(F32 x, F32 y, F32 z); // deprecated
inline void setVec(F32 x, F32 y, F32 z, F32 w); // deprecated
Expand Down Expand Up @@ -223,6 +234,21 @@ inline LLVector4::LLVector4(const LLSD &sd)
setValue(sd);
}

inline LLVector4::LLVector4(const glm::vec3& vec)
{
mV[VX] = vec.x;
mV[VY] = vec.y;
mV[VZ] = vec.z;
mV[VW] = 1.f;
}

inline LLVector4::LLVector4(const glm::vec4& vec)
{
mV[VX] = vec.x;
mV[VY] = vec.y;
mV[VZ] = vec.z;
mV[VW] = vec.w;
}

inline bool LLVector4::isFinite() const
{
Expand Down Expand Up @@ -297,6 +323,21 @@ inline void LLVector4::set(const F32 *vec)
mV[VW] = vec[VW];
}

inline void LLVector4::set(const glm::vec4& vec)
{
mV[VX] = vec.x;
mV[VY] = vec.y;
mV[VZ] = vec.z;
mV[VW] = vec.w;
}

inline void LLVector4::set(const glm::vec3& vec, F32 w)
{
mV[VX] = vec.x;
mV[VY] = vec.y;
mV[VZ] = vec.z;
mV[VW] = w;
}

// deprecated
inline void LLVector4::setVec(F32 x, F32 y, F32 z)
Expand Down Expand Up @@ -466,6 +507,16 @@ inline LLVector4 operator-(const LLVector4 &a)
return LLVector4( -a.mV[VX], -a.mV[VY], -a.mV[VZ] );
}

inline LLVector4::operator glm::vec3() const
{
return glm::vec3(mV[VX], mV[VY], mV[VZ]);
}

inline LLVector4::operator glm::vec4() const
{
return glm::make_vec4(mV);
}

inline F32 dist_vec(const LLVector4 &a, const LLVector4 &b)
{
LLVector4 vec = a - b;
Expand Down
22 changes: 12 additions & 10 deletions indra/llrender/llrender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -737,9 +737,8 @@ void LLLightState::setPosition(const LLVector4& position)
++gGL.mLightHash;
mPosition = position;
//transform position by current modelview matrix
glm::vec4 pos(glm::make_vec4(position.mV));
const glm::mat4& mat = gGL.getModelviewMatrix();
pos = mat * pos;
glm::vec4 pos(position);
pos = gGL.getModelviewMatrix() * pos;
mPosition.set(glm::value_ptr(pos));
}

Expand Down Expand Up @@ -794,7 +793,7 @@ void LLLightState::setSpotDirection(const LLVector3& direction)
++gGL.mLightHash;

//transform direction by current modelview matrix
glm::vec3 dir(glm::make_vec3(direction.mV));
glm::vec3 dir(direction);
const glm::mat3 mat(gGL.getModelviewMatrix());
dir = mat * dir;

Expand Down Expand Up @@ -2088,12 +2087,14 @@ void set_last_projection(const glm::mat4& mat)

glm::vec3 mul_mat4_vec3(const glm::mat4& mat, const glm::vec3& vec)
{
//const float w = vec[0] * mat[0][3] + vec[1] * mat[1][3] + vec[2] * mat[2][3] + mat[3][3];
//return glm::vec3(
// (vec[0] * mat[0][0] + vec[1] * mat[1][0] + vec[2] * mat[2][0] + mat[3][0]) / w,
// (vec[0] * mat[0][1] + vec[1] * mat[1][1] + vec[2] * mat[2][1] + mat[3][1]) / w,
// (vec[0] * mat[0][2] + vec[1] * mat[1][2] + vec[2] * mat[2][2] + mat[3][2]) / w
//);
#if 1 // SIMD path results in strange crashes. Fall back to scalar for now.
const float w = vec[0] * mat[0][3] + vec[1] * mat[1][3] + vec[2] * mat[2][3] + mat[3][3];
return glm::vec3(
(vec[0] * mat[0][0] + vec[1] * mat[1][0] + vec[2] * mat[2][0] + mat[3][0]) / w,
(vec[0] * mat[0][1] + vec[1] * mat[1][1] + vec[2] * mat[2][1] + mat[3][1]) / w,
(vec[0] * mat[0][2] + vec[1] * mat[1][2] + vec[2] * mat[2][2] + mat[3][2]) / w
);
#else
LLVector4a x, y, z, s, t, p, q;

x.splat(vec.x);
Expand Down Expand Up @@ -2123,4 +2124,5 @@ glm::vec3 mul_mat4_vec3(const glm::mat4& mat, const glm::vec3& vec)
res.setAdd(x, z);
res.div(q);
return glm::make_vec3(res.getF32ptr());
#endif
}
4 changes: 2 additions & 2 deletions indra/newview/gltfscenemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -975,9 +975,9 @@ void renderAssetDebug(LLViewerObject* obj, Asset* asset)

LLVector4a t;
agent_to_asset.affineTransform(gDebugRaycastStart, t);
start = glm::make_vec4(t.getF32ptr());
start = vec4(t);
agent_to_asset.affineTransform(gDebugRaycastEnd, t);
end = glm::make_vec4(t.getF32ptr());
end = vec4(t);

start.w = end.w = 1.0;

Expand Down
4 changes: 2 additions & 2 deletions indra/newview/llgltfmaterialpreviewmgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -472,9 +472,9 @@ bool LLGLTFPreviewTexture::render()

gPipeline.setupHWLights();
glm::mat4 mat = get_current_modelview();
glm::vec4 transformed_light_dir = glm::make_vec4(light_dir.mV);
glm::vec4 transformed_light_dir(light_dir);
transformed_light_dir = mat * transformed_light_dir;
SetTemporarily<LLVector4> force_sun_direction_high_graphics(&gPipeline.mTransformedSunDir, LLVector4(glm::value_ptr(transformed_light_dir)));
SetTemporarily<LLVector4> force_sun_direction_high_graphics(&gPipeline.mTransformedSunDir, LLVector4(transformed_light_dir));
// Override lights to ensure the sun is always shining from a certain direction (low graphics)
// See also force_sun_direction_high_graphics and fixup_shader_constants
{
Expand Down
2 changes: 1 addition & 1 deletion indra/newview/llhudrender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw();
glm::ivec4 viewport(world_view_rect.mLeft, world_view_rect.mBottom, world_view_rect.getWidth(), world_view_rect.getHeight());

glm::vec3 win_coord = glm::project(glm::make_vec3(render_pos.mV), get_current_modelview(), get_current_projection(), viewport);
glm::vec3 win_coord = glm::project(glm::vec3(render_pos), get_current_modelview(), get_current_projection(), viewport);

//fonts all render orthographically, set up projection``
gGL.matrixMode(LLRender::MM_PROJECTION);
Expand Down
4 changes: 2 additions & 2 deletions indra/newview/llpanelprimmediacontrols.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -660,11 +660,11 @@ void LLPanelPrimMediaControls::updateShape()
for(; vert_it != vert_end; ++vert_it)
{
// project silhouette vertices into screen space
glm::vec3 screen_vert(glm::make_vec3(vert_it->mV));
glm::vec3 screen_vert(*vert_it);
screen_vert = mul_mat4_vec3(mat, screen_vert);

// add to screenspace bounding box
update_min_max(min, max, LLVector3(glm::value_ptr(screen_vert)));
update_min_max(min, max, LLVector3(screen_vert));
}

// convert screenspace bbox to pixels (in screen coords)
Expand Down
2 changes: 1 addition & 1 deletion indra/newview/llreflectionmap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ bool LLReflectionMap::getBox(LLMatrix4& box)
glm::mat4 mv(get_current_modelview());
LLVector3 s = mViewerObject->getScale().scaledVec(LLVector3(0.5f, 0.5f, 0.5f));
mRadius = s.magVec();
glm::mat4 scale = glm::scale(glm::make_vec3(s.mV));
glm::mat4 scale = glm::scale(glm::vec3(s));
if (mViewerObject->mDrawable != nullptr)
{
// object to agent space (no scale)
Expand Down
4 changes: 2 additions & 2 deletions indra/newview/llsettingsvo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1093,8 +1093,8 @@ void LLSettingsVOWater::applySpecial(void *ptarget, bool force)

LLVector4 waterPlane(enorm.x, enorm.y, enorm.z, -glm::dot(ep, enorm));

norm = glm::make_vec3(gPipeline.mHeroProbeManager.mMirrorNormal.mV);
p = glm::make_vec3(gPipeline.mHeroProbeManager.mMirrorPosition.mV);
norm = glm::vec3(gPipeline.mHeroProbeManager.mMirrorNormal);
p = glm::vec3(gPipeline.mHeroProbeManager.mMirrorPosition);
enorm = mul_mat4_vec3(invtrans, norm);
enorm = glm::normalize(enorm);
ep = mul_mat4_vec3(mat, p);
Expand Down
4 changes: 2 additions & 2 deletions indra/newview/llviewercamera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ bool LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord

LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw();
glm::ivec4 viewport(world_view_rect.mLeft, world_view_rect.mBottom, world_view_rect.getWidth(), world_view_rect.getHeight());
glm::vec3 win_coord = glm::project(glm::make_vec3(pos_agent.mV), get_current_modelview(), get_current_projection(), viewport);
glm::vec3 win_coord = glm::project(glm::vec3(pos_agent), get_current_modelview(), get_current_projection(), viewport);

{
// convert screen coordinates to virtual UI coordinates
Expand Down Expand Up @@ -514,7 +514,7 @@ bool LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,
LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw();

glm::ivec4 viewport(world_view_rect.mLeft, world_view_rect.mBottom, world_view_rect.getWidth(), world_view_rect.getHeight());
glm::vec3 win_coord = glm::project(glm::make_vec3(pos_agent.mV), get_current_modelview(), get_current_projection(), viewport);
glm::vec3 win_coord = glm::project(glm::vec3(pos_agent), get_current_modelview(), get_current_projection(), viewport);

{
win_coord.x /= gViewerWindow->getDisplayScale().mV[VX];
Expand Down
10 changes: 5 additions & 5 deletions indra/newview/llvoavatar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1928,21 +1928,21 @@ bool LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&
glm::mat4 inverse = glm::inverse(mat);
glm::mat4 norm_mat = glm::transpose(inverse);

glm::vec3 p1(glm::make_vec3(start.getF32ptr()));
glm::vec3 p2(glm::make_vec3(end.getF32ptr()));
glm::vec3 p1(start);
glm::vec3 p2(end);

p1 = mul_mat4_vec3(inverse, p1);
p2 = mul_mat4_vec3(inverse, p2);

LLVector3 position;
LLVector3 norm;

if (linesegment_sphere(LLVector3(glm::value_ptr(p1)), LLVector3(glm::value_ptr(p2)), LLVector3(0,0,0), 1.f, position, norm))
if (linesegment_sphere(LLVector3(p1), LLVector3(p2), LLVector3(0,0,0), 1.f, position, norm))
{
glm::vec3 res_pos(glm::make_vec3(position.mV));
glm::vec3 res_pos(position);
res_pos = mul_mat4_vec3(mat, res_pos);

glm::vec3 res_norm(glm::make_vec3(norm.mV));
glm::vec3 res_norm(norm);
res_norm = glm::normalize(res_norm);
res_norm = glm::mat3(norm_mat) * res_norm;

Expand Down
Loading
Loading