diff --git a/indra/llappearance/llpolymorph.cpp b/indra/llappearance/llpolymorph.cpp
index 2cb4c65d7c49a197f1e871397c010a6038c6265f..ce7010984a0c74995873c02ce120116889c2141d 100644
--- a/indra/llappearance/llpolymorph.cpp
+++ b/indra/llappearance/llpolymorph.cpp
@@ -816,8 +816,8 @@ void LLPolyVertexMask::generateMask(U8 *maskTextureData, S32 width, S32 height,
 		U32 s = llclamp((U32)(uvCoords.mV[VX] * (F32)(width - 1)), (U32)0, (U32)width - 1);
 		U32 t = llclamp((U32)(uvCoords.mV[VY] * (F32)(height - 1)), (U32)0, (U32)height - 1);
 		
-		mWeights[index] = ((F32) maskTextureData[((t * width + s) * num_components) + (num_components - 1)]) / 255.f;
-		
+		mWeights[index] = maskTextureData ? ((F32) maskTextureData[((t * width + s) * num_components) + (num_components - 1)]) / 255.f : 0.0f;
+
 		if (invert) 
 		{
 			mWeights[index] = 1.f - mWeights[index];
diff --git a/indra/llappearance/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp
index 3f2fcce429804c52bb3a240fe2259b19c9838572..22b33645593bb0a2bc3b3eaf42b9fabecba7ffcf 100644
--- a/indra/llappearance/lltexlayer.cpp
+++ b/indra/llappearance/lltexlayer.cpp
@@ -1575,14 +1575,30 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
 				delete [] alpha_data;
 				mAlphaCache.erase(iter2);
 			}
-			alpha_data = new U8[width * height];
+			
+            // GPUs tend to be very uptight about memory alignment as the DMA used to convey
+            // said data to the card works better when well-aligned so plain old default-aligned heap mem is a no-no
+            //new U8[width * height];
+            size_t mem_size = (width * height);
+            size_t rem = (mem_size & 0x3F);
+            mem_size += rem > 0 ? (mem_size + (32 - rem)) : 0;
+
+            alpha_data = (U8*)ll_aligned_malloc_32(mem_size);
+
 			mAlphaCache[cache_index] = alpha_data;
-    
-			// nSight doesn't support use of glReadPixels
-			if (!LLRender::sNsightDebugSupport)
+
+            bool skip_readback = LLRender::sNsightDebugSupport; // nSight doesn't support use of glReadPixels
+            // || gGLManager.mIsIntel; SL-10625?
+
+			if (!skip_readback)
 			{
-				glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data);
+				glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data);                
 			}
+            else
+            {
+                ll_aligned_free_32(alpha_data);
+                alpha_data = nullptr;
+            }            
 		}
 		
 		getTexLayerSet()->getAvatarAppearance()->dirtyMesh();
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 8aaf678aba0974d1e2bb73bc8e49a84ae2945547..3740caa53fb8e4f6688ef9ff008c3299fa181de6 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -6453,7 +6453,8 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
 			bool use_legacy_bump = te->getBumpmap() && (te->getBumpmap() < 18) && (!mat || mat->getNormalID().isNull());
 			bool opaque = te_alpha >= 0.999f;
             bool transparent = te_alpha < 0.999f;
-            bool invisible = te_alpha <= 0.0f;
+
+            is_alpha = (is_alpha || transparent) ? TRUE : FALSE;
 
 			if (mat && LLPipeline::sRenderDeferred && !hud_group)
 			{
@@ -6551,7 +6552,10 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
 			else if (mat)
 			{
 				U8 mode = mat->getDiffuseAlphaMode();
-				if (transparent)
+
+                is_alpha = (is_alpha || (mode == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND));
+
+				if (is_alpha)
 				{
 					mode = LLMaterial::DIFFUSE_ALPHA_MODE_BLEND;
 				}
@@ -6560,7 +6564,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
 				{
 					registerFace(group, facep, fullbright ? LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK : LLRenderPass::PASS_ALPHA_MASK);
 				}
-				else if (is_alpha || transparent)
+				else if (is_alpha )
 				{
 					registerFace(group, facep, LLRenderPass::PASS_ALPHA);
 				}
@@ -6579,7 +6583,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
 			else if (is_alpha)
 			{
 				// can we safely treat this as an alpha mask?
-				if (invisible)
+				if (facep->getFaceColor().mV[3] <= 0.f)
 				{ //100% transparent, don't render unless we're highlighting transparent
 					registerFace(group, facep, LLRenderPass::PASS_ALPHA_INVISIBLE);
 				}