diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index c57ab4219..4b2b52d76 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -155,6 +155,10 @@ const U32 DEFERRED_VB_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TE
// Max number of occluders to search for. JC
const S32 MAX_OCCLUDER_COUNT = 2;
+// FIRE-11593: Teleporting more than 4096 regions away clears screen
+const F32 MAX_SHIFT_DISTANCE = 256.f * 4095; //maximum distance to shift spatial partitions
+// FIRE-11593
+
extern S32 gBoxFrame;
//extern BOOL gHideSelectedObjects;
extern BOOL gDisplaySwapBuffers;
@@ -4004,6 +4008,17 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
//LLGLState::checkTextureChannels();
//LLGLState::checkClientArrays();
+ // FIRE-11593: Teleporting more than 4096 regions away clears screen
+ // The spatial partition octree shift code has problems with
+ // shifts of more than 4096 regions (1M meters). We shift just
+ // less than that distance, and let later processing deal with
+ // all the spatial partitions that are shifted far enough away
+ // that we'll never see them anyway.
+ if (offset.length() > MAX_SHIFT_DISTANCE)
+ {
+ offseta.splat(MAX_SHIFT_DISTANCE);
+ }
+ // FIRE-11593
//stop_glerror();