summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@lindenlab.com>2026-04-17 14:52:00 -0400
committerGitHub <noreply@github.com>2026-04-17 14:52:00 -0400
commit7f110d9fb54d050e0b25ea65294a53d2595fc89b (patch)
tree023ddb3a64bdf77275142efd207916b5e5dfbc90
parent5f91a3faf3ef0b9d0a6c3424fff119992dc0822a (diff)
parentead40173830602f6bf0b1b62573de22523c263f6 (diff)
Merge pull request #5667 from secondlife/geenz/texture-channel-cherrypick
Add texture streaming "channels" (#5442)
-rw-r--r--indra/llxml/llcontrol.cpp45
-rw-r--r--indra/llxml/llcontrol.h8
-rw-r--r--indra/newview/app_settings/settings.xml16
-rw-r--r--indra/newview/llfloatersettingsdebug.cpp42
-rw-r--r--indra/newview/llviewertexturelist.cpp32
5 files changed, 143 insertions, 0 deletions
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index 34643d5f5c..5a37167f18 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -37,6 +37,7 @@
#include "llstring.h"
#include "v3math.h"
#include "v3dmath.h"
+#include "v4math.h"
#include "v4coloru.h"
#include "v4color.h"
#include "v3color.h"
@@ -63,6 +64,7 @@ template <> eControlType get_control_type<std::string>();
template <> eControlType get_control_type<LLVector3>();
template <> eControlType get_control_type<LLVector3d>();
+template <> eControlType get_control_type<LLVector4>();
template <> eControlType get_control_type<LLRect>();
template <> eControlType get_control_type<LLColor4>();
template <> eControlType get_control_type<LLColor3>();
@@ -72,6 +74,7 @@ template <> eControlType get_control_type<LLSD>();
template <> LLSD convert_to_llsd<U32>(const U32& in);
template <> LLSD convert_to_llsd<LLVector3>(const LLVector3& in);
template <> LLSD convert_to_llsd<LLVector3d>(const LLVector3d& in);
+template <> LLSD convert_to_llsd<LLVector4>(const LLVector4& in);
template <> LLSD convert_to_llsd<LLRect>(const LLRect& in);
template <> LLSD convert_to_llsd<LLColor4>(const LLColor4& in);
template <> LLSD convert_to_llsd<LLColor3>(const LLColor3& in);
@@ -85,6 +88,7 @@ template <> std::string convert_from_llsd<std::string>(const LLSD& sd, eControlT
template <> LLWString convert_from_llsd<LLWString>(const LLSD& sd, eControlType type, std::string_view control_name);
template <> LLVector3 convert_from_llsd<LLVector3>(const LLSD& sd, eControlType type, std::string_view control_name);
template <> LLVector3d convert_from_llsd<LLVector3d>(const LLSD& sd, eControlType type, std::string_view control_name);
+template <> LLVector4 convert_from_llsd<LLVector4>(const LLSD& sd, eControlType type, std::string_view control_name);
template <> LLRect convert_from_llsd<LLRect>(const LLSD& sd, eControlType type, std::string_view control_name);
template <> LLColor4 convert_from_llsd<LLColor4>(const LLSD& sd, eControlType type, std::string_view control_name);
template <> LLColor4U convert_from_llsd<LLColor4U>(const LLSD& sd, eControlType type, std::string_view control_name);
@@ -124,6 +128,9 @@ bool LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b)
case TYPE_VEC3D:
result = LLVector3d(a) == LLVector3d(b);
break;
+ case TYPE_VEC4:
+ result = LLVector4(a) == LLVector4(b);
+ break;
case TYPE_QUAT:
result = LLQuaternion(a) == LLQuaternion(b);
break;
@@ -373,6 +380,7 @@ const std::string LLControlGroup::mTypeString[TYPE_COUNT] = { "U32"
,"Rect"
,"Color4"
,"Color3"
+ ,"Vector4"
,"LLSD"
};
@@ -532,6 +540,11 @@ LLControlVariable* LLControlGroup::declareVec3d(const std::string& name, const L
return declareControl(name, TYPE_VEC3D, initial_val.getValue(), comment, persist);
}
+LLControlVariable* LLControlGroup::declareVec4(const std::string& name, const LLVector4 &initial_val, const std::string& comment, LLControlVariable::ePersist persist)
+{
+ return declareControl(name, TYPE_VEC4, initial_val.getValue(), comment, persist);
+}
+
LLControlVariable* LLControlGroup::declareQuat(const std::string& name, const LLQuaternion &initial_val, const std::string& comment, LLControlVariable::ePersist persist)
{
return declareControl(name, TYPE_QUAT, initial_val.getValue(), comment, persist);
@@ -614,6 +627,11 @@ LLVector3d LLControlGroup::getVector3d(std::string_view name)
return get<LLVector3d>(name);
}
+LLVector4 LLControlGroup::getVector4(std::string_view name)
+{
+ return get<LLVector4>(name);
+}
+
LLQuaternion LLControlGroup::getQuaternion(std::string_view name)
{
return get<LLQuaternion>(name);
@@ -714,6 +732,11 @@ void LLControlGroup::setVector3d(std::string_view name, const LLVector3d &val)
set(name, val);
}
+void LLControlGroup::setVector4(std::string_view name, const LLVector4 &val)
+{
+ set(name, val);
+}
+
void LLControlGroup::setQuaternion(std::string_view name, const LLQuaternion &val)
{
set(name, val);
@@ -1262,6 +1285,11 @@ template <> eControlType get_control_type<LLVector3d>()
return TYPE_VEC3D;
}
+template <> eControlType get_control_type<LLVector4>()
+{
+ return TYPE_VEC4;
+}
+
template <> eControlType get_control_type<LLQuaternion>()
{
return TYPE_QUAT;
@@ -1302,6 +1330,11 @@ template <> LLSD convert_to_llsd<LLVector3d>(const LLVector3d& in)
{
return in.getValue();
}
+template <> LLSD convert_to_llsd<LLVector4>(const LLVector4& in)
+{
+ return in.getValue();
+}
+
template <> LLSD convert_to_llsd<LLQuaternion>(const LLQuaternion& in)
{
return in.getValue();
@@ -1419,6 +1452,18 @@ LLVector3d convert_from_llsd<LLVector3d>(const LLSD& sd, eControlType type, std:
}
template<>
+LLVector4 convert_from_llsd<LLVector4>(const LLSD& sd, eControlType type, std::string_view control_name)
+{
+ if (type == TYPE_VEC4)
+ return LLVector4(sd);
+ else
+ {
+ CONTROL_ERRS << "Invalid LLVector4 value for " << control_name << ": " << LLControlGroup::typeEnumToString(type) << " " << sd << LL_ENDL;
+ return LLVector4();
+ }
+}
+
+template<>
LLQuaternion convert_from_llsd<LLQuaternion>(const LLSD& sd, eControlType type, std::string_view control_name)
{
if (type == TYPE_QUAT)
diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h
index 5aa2b9715e..c2bcd20c85 100644
--- a/indra/llxml/llcontrol.h
+++ b/indra/llxml/llcontrol.h
@@ -43,6 +43,7 @@
class LLVector3;
class LLVector3d;
+class LLVector4;
class LLQuaternion;
class LLColor4;
class LLColor3;
@@ -61,6 +62,7 @@ typedef enum e_control_type
TYPE_RECT,
TYPE_COL4,
TYPE_COL3,
+ TYPE_VEC4,
TYPE_LLSD,
TYPE_COUNT
} eControlType;
@@ -196,6 +198,7 @@ public:
LLControlVariable* declareString(const std::string& name, const std::string &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
LLControlVariable* declareVec3(const std::string& name, const LLVector3 &initial_val,const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
LLControlVariable* declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
+ LLControlVariable* declareVec4(const std::string& name, const LLVector4 &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
LLControlVariable* declareQuat(const std::string& name, const LLQuaternion &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
LLControlVariable* declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
LLControlVariable* declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
@@ -212,6 +215,7 @@ public:
LLWString getWString(std::string_view name);
LLVector3 getVector3(std::string_view name);
LLVector3d getVector3d(std::string_view name);
+ LLVector4 getVector4(std::string_view name);
LLRect getRect(std::string_view name);
LLSD getLLSD(std::string_view name);
LLQuaternion getQuaternion(std::string_view name);
@@ -250,6 +254,7 @@ public:
void setString(std::string_view name, const std::string& val);
void setVector3(std::string_view name, const LLVector3 &val);
void setVector3d(std::string_view name, const LLVector3d &val);
+ void setVector4(std::string_view name, const LLVector4 &val);
void setQuaternion(std::string_view name, const LLQuaternion &val);
void setRect(std::string_view name, const LLRect &val);
void setColor4(std::string_view name, const LLColor4 &val);
@@ -416,6 +421,7 @@ template <> eControlType get_control_type<bool>();
template <> eControlType get_control_type<std::string>();
template <> eControlType get_control_type<LLVector3>();
template <> eControlType get_control_type<LLVector3d>();
+template <> eControlType get_control_type<LLVector4>();
template <> eControlType get_control_type<LLQuaternion>();
template <> eControlType get_control_type<LLRect>();
template <> eControlType get_control_type<LLColor4>();
@@ -425,6 +431,7 @@ template <> eControlType get_control_type<LLSD>();
template <> LLSD convert_to_llsd<U32>(const U32& in);
template <> LLSD convert_to_llsd<LLVector3>(const LLVector3& in);
template <> LLSD convert_to_llsd<LLVector3d>(const LLVector3d& in);
+template <> LLSD convert_to_llsd<LLVector4>(const LLVector4& in);
template <> LLSD convert_to_llsd<LLQuaternion>(const LLQuaternion& in);
template <> LLSD convert_to_llsd<LLRect>(const LLRect& in);
template <> LLSD convert_to_llsd<LLColor4>(const LLColor4& in);
@@ -434,6 +441,7 @@ template<> std::string convert_from_llsd<std::string>(const LLSD& sd, eControlTy
template<> LLWString convert_from_llsd<LLWString>(const LLSD& sd, eControlType type, std::string_view control_name);
template<> LLVector3 convert_from_llsd<LLVector3>(const LLSD& sd, eControlType type, std::string_view control_name);
template<> LLVector3d convert_from_llsd<LLVector3d>(const LLSD& sd, eControlType type, std::string_view control_name);
+template<> LLVector4 convert_from_llsd<LLVector4>(const LLSD& sd, eControlType type, std::string_view control_name);
template<> LLQuaternion convert_from_llsd<LLQuaternion>(const LLSD& sd, eControlType type, std::string_view control_name);
template<> LLRect convert_from_llsd<LLRect>(const LLSD& sd, eControlType type, std::string_view control_name);
template<> bool convert_from_llsd<bool>(const LLSD& sd, eControlType type, std::string_view control_name);
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index a4a9323892..d7026d2dce 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11805,6 +11805,22 @@
<key>Value</key>
<real>20.0</real>
</map>
+ <key>TextureChannelPriority</key>
+ <map>
+ <key>Comment</key>
+ <string>Per-channel texture streaming aggressiveness. X=normals, Y=diffuse, Z=specular/metallic, W=emissive. 1.0=baseline, higher=more aggressive downrez.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector4</string>
+ <key>Value</key>
+ <array>
+ <real>5</real>
+ <real>7.5</real>
+ <real>20</real>
+ <real>7.5</real>
+ </array>
+ </map>
<key>TextureCameraBoost</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp
index 01108b5cfa..92b3c92165 100644
--- a/indra/newview/llfloatersettingsdebug.cpp
+++ b/indra/newview/llfloatersettingsdebug.cpp
@@ -106,6 +106,7 @@ void LLFloaterSettingsDebug::onCommitSettings()
LLVector3 vector;
LLVector3d vectord;
+ LLVector4 vector4;
LLQuaternion quat;
LLRect rect;
LLColor4 col4;
@@ -142,6 +143,13 @@ void LLFloaterSettingsDebug::onCommitSettings()
vectord.mdV[VZ] = mValSpinner3->getValue().asReal();
controlp->set(vectord.getValue());
break;
+ case TYPE_VEC4:
+ vector4.mV[VX] = (F32)mValSpinner1->getValue().asReal();
+ vector4.mV[VY] = (F32)mValSpinner2->getValue().asReal();
+ vector4.mV[VZ] = (F32)mValSpinner3->getValue().asReal();
+ vector4.mV[VW] = (F32)mValSpinner4->getValue().asReal();
+ controlp->set(vector4.getValue());
+ break;
case TYPE_QUAT:
quat.mQ[VX] = mValSpinner1->getValueF32();
quat.mQ[VY] = mValSpinner2->getValueF32();
@@ -352,6 +360,40 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
}
break;
}
+ case TYPE_VEC4:
+ {
+ LLVector4 v;
+ v.setValue(sd);
+ mValSpinner1->setVisible(true);
+ mValSpinner1->setLabel(std::string("X"));
+ mValSpinner2->setVisible(true);
+ mValSpinner2->setLabel(std::string("Y"));
+ mValSpinner3->setVisible(true);
+ mValSpinner3->setLabel(std::string("Z"));
+ mValSpinner4->setVisible(true);
+ mValSpinner4->setLabel(std::string("W"));
+ if (!mValSpinner1->hasFocus())
+ {
+ mValSpinner1->setPrecision(3);
+ mValSpinner1->setValue(v[VX]);
+ }
+ if (!mValSpinner2->hasFocus())
+ {
+ mValSpinner2->setPrecision(3);
+ mValSpinner2->setValue(v[VY]);
+ }
+ if (!mValSpinner3->hasFocus())
+ {
+ mValSpinner3->setPrecision(3);
+ mValSpinner3->setValue(v[VZ]);
+ }
+ if (!mValSpinner4->hasFocus())
+ {
+ mValSpinner4->setPrecision(3);
+ mValSpinner4->setValue(v[VW]);
+ }
+ break;
+ }
case TYPE_QUAT:
{
LLQuaternion q;
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index e4fd947892..7dd32074cf 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -1014,6 +1014,38 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
}
imagep->addTextureStats(max_vsize);
+
+ // Derive stream priority channel from face lists.
+ // Map render texture channels to priority channels:
+ // 0 = normal, 1 = diffuse, 2 = specular, 3 = emissive
+ {
+ static const S32 render_to_priority[] = {
+ 1, // DIFFUSE_MAP (0)
+ 0, // NORMAL_MAP / ALTERNATE_DIFFUSE_MAP (1)
+ 2, // SPECULAR_MAP (2)
+ 1, // BASECOLOR_MAP (3)
+ 2, // METALLIC_ROUGHNESS_MAP (4)
+ 0, // GLTF_NORMAL_MAP (5)
+ 3, // EMISSIVE_MAP (6)
+ };
+
+ S32 priority_channel = 1; // default to diffuse
+ for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
+ {
+ if (imagep->getNumFaces(i) > 0)
+ {
+ priority_channel = llmin(priority_channel, render_to_priority[i]);
+ }
+ }
+
+ static LLCachedControl<LLVector4> channel_priority(gSavedSettings, "TextureChannelPriority",
+ LLVector4(10.0f, 20.0f, 40.0f, 20.0f));
+ F32 factor = llmax(channel_priority().mV[priority_channel], 0.1f);
+ if (factor != 1.0f)
+ {
+ imagep->mMaxVirtualSize /= factor;
+ }
+ }
}
#if 0