Log the switch value when reaching an UNREACHABLE().

Bug 20025568

Change-Id: I37d2c7171e0704b4064e56e8ca8799f930038d87
Reviewed-on: https://swiftshader-review.googlesource.com/3481
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Common/DebugAndroid.hpp b/src/Common/DebugAndroid.hpp
index f87ba66..41dd3ba 100644
--- a/src/Common/DebugAndroid.hpp
+++ b/src/Common/DebugAndroid.hpp
@@ -56,10 +56,10 @@
 		AndroidEnterDebugger();						\
 	} while(0)
 
-#define UNREACHABLE() do {								\
-		ALOGE("badness: unreachable reached: %s %s:%d",	\
-			  __FUNCTION__, __FILE__, __LINE__);		\
-		AndroidEnterDebugger();							\
+#define UNREACHABLE(value) do {                                         \
+		ALOGE("badness: unreachable case reached: %s %s:%d. value: %d", \
+			  __FUNCTION__, __FILE__, __LINE__, value);                 \
+		AndroidEnterDebugger();                                         \
 	} while(0)
 
 #ifndef NDEBUG
diff --git a/src/OpenGL/common/Image.cpp b/src/OpenGL/common/Image.cpp
index 5b1aedc..691e77e 100644
--- a/src/OpenGL/common/Image.cpp
+++ b/src/OpenGL/common/Image.cpp
@@ -353,7 +353,7 @@
 			case GL_HALF_FLOAT:     return sw::FORMAT_L16F;
 			case GL_HALF_FLOAT_OES: return sw::FORMAT_L16F;
 			case GL_FLOAT:          return sw::FORMAT_L32F;
-			default: UNREACHABLE();
+			default: UNREACHABLE(type);
 			}
 			break;
 		case GL_LUMINANCE_ALPHA:
@@ -363,7 +363,7 @@
 			case GL_HALF_FLOAT:     return sw::FORMAT_A16L16F;
 			case GL_HALF_FLOAT_OES: return sw::FORMAT_A16L16F;
 			case GL_FLOAT:          return sw::FORMAT_A32L32F;
-			default: UNREACHABLE();
+			default: UNREACHABLE(type);
 			}
 			break;
 		case GL_RGBA:
@@ -375,14 +375,14 @@
 			case GL_HALF_FLOAT:             return sw::FORMAT_A16B16G16R16F;
 			case GL_HALF_FLOAT_OES:         return sw::FORMAT_A16B16G16R16F;
 			case GL_FLOAT:                  return sw::FORMAT_A32B32G32R32F;
-			default: UNREACHABLE();
+			default: UNREACHABLE(type);
 			}
 			break;
 		case GL_BGRA_EXT:
 			switch(type)
 			{
 			case GL_UNSIGNED_BYTE:          return sw::FORMAT_A8R8G8B8;
-			default: UNREACHABLE();
+			default: UNREACHABLE(type);
 			}
 			break;
 		case GL_RGB:
@@ -393,7 +393,7 @@
 			case GL_HALF_FLOAT:             return sw::FORMAT_B16G16R16F;
 			case GL_HALF_FLOAT_OES:         return sw::FORMAT_B16G16R16F;
 			case GL_FLOAT:                  return sw::FORMAT_B32G32R32F;
-			default: UNREACHABLE();
+			default: UNREACHABLE(type);
 			}
 			break;
 		case GL_ALPHA:
@@ -403,11 +403,11 @@
 			case GL_HALF_FLOAT:             return sw::FORMAT_A16F;
 			case GL_HALF_FLOAT_OES:         return sw::FORMAT_A16F;
 			case GL_FLOAT:                  return sw::FORMAT_A32F;
-			default: UNREACHABLE();
+			default: UNREACHABLE(type);
 			}
 			break;
 		default:
-			UNREACHABLE();
+			UNREACHABLE(format);
 		}
 
 		return sw::FORMAT_NULL;
@@ -470,7 +470,7 @@
 			{
 				return sw::FORMAT_A8;
 			}
-			else UNREACHABLE();
+			else UNREACHABLE(format);
 		}
 		else if(type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT)
 		{
@@ -478,7 +478,7 @@
 			{
 				return sw::FORMAT_D32FS8_TEXTURE;
 			}
-			else UNREACHABLE();
+			else UNREACHABLE(format);
 		}
 		else if(type == GL_UNSIGNED_INT_24_8_OES)
 		{
@@ -486,7 +486,7 @@
 			{
 				return sw::FORMAT_D32FS8_TEXTURE;
 			}
-			else UNREACHABLE();
+			else UNREACHABLE(format);
 		}
 		else if(type == GL_UNSIGNED_SHORT_4_4_4_4)
 		{
@@ -500,7 +500,7 @@
 		{
 			return sw::FORMAT_X8R8G8B8;
 		}
-		else UNREACHABLE();
+		else UNREACHABLE(type);
 
 		return sw::FORMAT_A8B8G8R8;
 	}
@@ -519,7 +519,7 @@
 			case GL_RGB:             return sizeof(unsigned char) * 3;
 			case GL_RGBA:            return sizeof(unsigned char) * 4;
 			case GL_BGRA_EXT:        return sizeof(unsigned char) * 4;
-			default: UNREACHABLE();
+			default: UNREACHABLE(format);
 			}
 			break;
 		case GL_UNSIGNED_SHORT_4_4_4_4:
@@ -538,7 +538,7 @@
 			case GL_LUMINANCE_ALPHA: return sizeof(float) * 2;
 			case GL_RGB:             return sizeof(float) * 3;
 			case GL_RGBA:            return sizeof(float) * 4;
-			default: UNREACHABLE();
+			default: UNREACHABLE(format);
 			}
 			break;
 		case GL_HALF_FLOAT:
@@ -550,10 +550,10 @@
 			case GL_LUMINANCE_ALPHA: return sizeof(unsigned short) * 2;
 			case GL_RGB:             return sizeof(unsigned short) * 3;
 			case GL_RGBA:            return sizeof(unsigned short) * 4;
-			default: UNREACHABLE();
+			default: UNREACHABLE(format);
 			}
 			break;
-		default: UNREACHABLE();
+		default: UNREACHABLE(type);
 		}
 
 		return 0;
@@ -673,7 +673,7 @@
 					case GL_BGRA_EXT:
 						LoadImageData<UByte4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
-					default: UNREACHABLE();
+					default: UNREACHABLE(format);
 					}
 					break;
 				case GL_UNSIGNED_SHORT_5_6_5:
@@ -682,7 +682,7 @@
 					case GL_RGB:
 						LoadImageData<RGB565>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
-					default: UNREACHABLE();
+					default: UNREACHABLE(format);
 					}
 					break;
 				case GL_UNSIGNED_SHORT_4_4_4_4:
@@ -691,7 +691,7 @@
 					case GL_RGBA:
 						LoadImageData<RGBA4444>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
-					default: UNREACHABLE();
+					default: UNREACHABLE(format);
 					}
 					break;
 				case GL_UNSIGNED_SHORT_5_5_5_1:
@@ -700,7 +700,7 @@
 					case GL_RGBA:
 						LoadImageData<RGBA5551>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
-					default: UNREACHABLE();
+					default: UNREACHABLE(format);
 					}
 					break;
 				case GL_FLOAT:
@@ -722,7 +722,7 @@
 					case GL_RGBA:
 						LoadImageData<Float4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
-					default: UNREACHABLE();
+					default: UNREACHABLE(format);
 					}
 					break;
 				case GL_HALF_FLOAT:
@@ -744,7 +744,7 @@
 					case GL_RGBA:
 						LoadImageData<HalfFloat4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
-					default: UNREACHABLE();
+					default: UNREACHABLE(format);
 					}
 					break;
 				case GL_UNSIGNED_SHORT:
@@ -756,7 +756,7 @@
 				case GL_UNSIGNED_INT_24_8_OES:
 					loadD24S8ImageData(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, input, buffer);
 					break;
-				default: UNREACHABLE();
+				default: UNREACHABLE(type);
 				}
 			}
 
diff --git a/src/OpenGL/common/debug.h b/src/OpenGL/common/debug.h
index a210596..5035399 100644
--- a/src/OpenGL/common/debug.h
+++ b/src/OpenGL/common/debug.h
@@ -77,12 +77,12 @@
 // A macro for code which is not expected to be reached under valid assumptions

 #undef UNREACHABLE

 #if !defined(NDEBUG)

-#define UNREACHABLE() do { \

-    ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__); \

+#define UNREACHABLE(value) do { \

+    ERR("\t! Unreachable case reached: %s(%d). Value: %d\n", __FUNCTION__, __LINE__, value); \

     assert(false); \

     } while(0)

 #else

-    #define UNREACHABLE() ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__)

+    #define UNREACHABLE(value) ERR("\t! Unreachable reached: %s(%d). Value: %d\n", __FUNCTION__, __LINE__, value)

 #endif

 

 #endif   // __ANDROID__

diff --git a/src/OpenGL/compiler/AnalyzeCallDepth.cpp b/src/OpenGL/compiler/AnalyzeCallDepth.cpp
index fedd552..94c3540 100644
--- a/src/OpenGL/compiler/AnalyzeCallDepth.cpp
+++ b/src/OpenGL/compiler/AnalyzeCallDepth.cpp
@@ -52,7 +52,7 @@
 			callDepth = std::max(callDepth, 1 + callees[i]->analyzeCallDepth(analyzeCallDepth));

 			break;

         default:

-            UNREACHABLE();

+            UNREACHABLE(callees[i]->visit);

             break;

         }

     }

diff --git a/src/OpenGL/compiler/BaseTypes.h b/src/OpenGL/compiler/BaseTypes.h
index baf3cc0..84299e5 100644
--- a/src/OpenGL/compiler/BaseTypes.h
+++ b/src/OpenGL/compiler/BaseTypes.h
@@ -108,7 +108,7 @@
     case EbtSamplerExternalOES: return "samplerExternalOES";
 	case EbtSampler3D:			return "sampler3D";
     case EbtStruct:             return "structure";
-    default: UNREACHABLE();     return "unknown type";
+    default: UNREACHABLE(type); return "unknown type";
     }
 }
 
@@ -119,7 +119,7 @@
 	case EmpUnspecified:    return "mp_unspecified";
 	case EmpRowMajor:       return "row_major";
 	case EmpColumnMajor:    return "column_major";
-	default: UNREACHABLE(); return "unknown matrix packing";
+	default: UNREACHABLE(mpq); return "unknown matrix packing";
 	}
 }
 
@@ -131,7 +131,7 @@
 	case EbsShared:         return "shared";
 	case EbsPacked:         return "packed";
 	case EbsStd140:         return "std140";
-	default: UNREACHABLE(); return "unknown block storage";
+	default: UNREACHABLE(bsq); return "unknown block storage";
 	}
 }
 
@@ -447,7 +447,7 @@
     case EvqSmoothIn:       return "SmoothIn";       break;
     case EvqFlatIn:         return "FlatIn";         break;
     case EvqCentroidIn:     return "CentroidIn";     break;
-    default: UNREACHABLE(); return "unknown qualifier";
+    default: UNREACHABLE(qualifier); return "unknown qualifier";
     }
 }
 
diff --git a/src/OpenGL/compiler/Diagnostics.cpp b/src/OpenGL/compiler/Diagnostics.cpp
index 8037af0..32715ad 100644
--- a/src/OpenGL/compiler/Diagnostics.cpp
+++ b/src/OpenGL/compiler/Diagnostics.cpp
@@ -45,7 +45,7 @@
         prefix = EPrefixWarning;
         break;
       default:
-        UNREACHABLE();
+        UNREACHABLE(severity);
         break;
     }
 
diff --git a/src/OpenGL/compiler/DirectiveHandler.cpp b/src/OpenGL/compiler/DirectiveHandler.cpp
index ae6727b..c9368b1 100644
--- a/src/OpenGL/compiler/DirectiveHandler.cpp
+++ b/src/OpenGL/compiler/DirectiveHandler.cpp
@@ -140,7 +140,7 @@
         severity = pp::Diagnostics::PP_WARNING;
         break;
       default:
-        UNREACHABLE();
+        UNREACHABLE(behaviorVal);
         break;
     }
     mDiagnostics.writeInfo(severity, loc,
diff --git a/src/OpenGL/compiler/Intermediate.cpp b/src/OpenGL/compiler/Intermediate.cpp
index 62658a4..40be9be 100644
--- a/src/OpenGL/compiler/Intermediate.cpp
+++ b/src/OpenGL/compiler/Intermediate.cpp
@@ -48,7 +48,7 @@
 		return left.getNominalSize() == right.getNominalSize() &&
 		       left.getSecondarySize() == right.getSecondarySize();
 	default:
-		UNREACHABLE();
+		UNREACHABLE(op);
 		return false;
 	}
 }
@@ -1140,7 +1140,7 @@
 		                    unionArray[14].getFConst(),
 		                    unionArray[15].getFConst());
 	default:
-		UNREACHABLE();
+		UNREACHABLE(size);
 		return 0.0f;
 	}
 }
@@ -1227,7 +1227,7 @@
 			}
 			break;
 		default:
-			UNREACHABLE();
+			UNREACHABLE(size);
 		}
 	}
 	return tempConstArray;
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index 562a577..67aada7 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -285,9 +285,9 @@
 						ASSERT(index < left->getNominalSize());   // FIXME: Report semantic error

 						argument(mov->src[0], left, index);

 					}

-					else UNREACHABLE();

+					else UNREACHABLE(0);

  				}

-				else UNREACHABLE();

+				else UNREACHABLE(0);

 			}

 			break;

 		case EOpIndexIndirect:

@@ -318,7 +318,7 @@
 				{

 					emit(sw::Shader::OPCODE_EXTRACT, result, left, right);

 				}

-				else UNREACHABLE();

+				else UNREACHABLE(0);

 			}

 			break;

 		case EOpIndexDirectStruct:

@@ -359,10 +359,10 @@
 							swizzle |= i << (component * 2);

 							component++;

 						}

-						else UNREACHABLE();

+						else UNREACHABLE(0);

 					}

 				}

-				else UNREACHABLE();

+				else UNREACHABLE(0);

 

 				Instruction *mov = emit(sw::Shader::OPCODE_MOV, result, left);

 				mov->src[0].swizzle = swizzle;

@@ -516,7 +516,7 @@
 				}

 			}

 			break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(node->getOp());

 		}

 

 		return true;

@@ -663,7 +663,7 @@
 				}

 			}

 			break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(node->getOp());

 		}

 

 		return true;

@@ -720,7 +720,7 @@
 						functionArray.push_back(Function(functionArray.size(), name, &arguments, node));

 					}

 				}

-				else UNREACHABLE();

+				else UNREACHABLE(emitScope);

 

 				currentScope = FUNCTION;

 			}

@@ -806,7 +806,7 @@
 							Instruction *tex = emit(sw::Shader::OPCODE_TEX, result, &uvwb, arg[0]);   // FIXME: Implement an efficient TEXLDB instruction

 							tex->bias = true;

 						}

-						else UNREACHABLE();

+						else UNREACHABLE(argumentCount);

 					}

 					else if(name == "texture2DProj")

 					{

@@ -839,7 +839,7 @@
 								div->src[1].swizzle = 0xFF;

 								div->dst.mask = 0x3;

 							}

-							else UNREACHABLE();

+							else UNREACHABLE(t->getNominalSize());

 

 							Instruction *bias = emit(sw::Shader::OPCODE_MOV, &proj, arg[2]);

 							bias->dst.mask = 0x8;

@@ -847,7 +847,7 @@
 							Instruction *tex = emit(sw::Shader::OPCODE_TEX, result, &proj, arg[0]);

 							tex->bias = true;

 						}

-						else UNREACHABLE();

+						else UNREACHABLE(argumentCount);

 					}

 					else if(name == "texture2DLod" || name == "textureCubeLod")

 					{

@@ -875,14 +875,14 @@
 							div->src[1].swizzle = 0xFF;

 							div->dst.mask = 0x3;

 						}

-						else UNREACHABLE();

+						else UNREACHABLE(t->getNominalSize());

 

 						Instruction *lod = emit(sw::Shader::OPCODE_MOV, &proj, arg[2]);

 						lod->dst.mask = 0x8;

 

 						emit(sw::Shader::OPCODE_TEXLDL, result, &proj, arg[0]);

 					}

-					else UNREACHABLE();

+					else UNREACHABLE(0);

 				}

 			}

 			break;

@@ -1096,7 +1096,7 @@
 				}

 			}

 			break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(node->getOp());

 		}

 

 		return true;

@@ -1325,7 +1325,7 @@
 				emit(sw::Shader::OPCODE_LEAVE);

 			}

 			break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(node->getFlowOp());

 		}

 

 		return true;

@@ -1455,7 +1455,7 @@
 			return registers * type.getSecondarySize();

 		}

 		

-		UNREACHABLE();

+		UNREACHABLE(0);

 		return 0;

 	}

 

@@ -1503,7 +1503,7 @@
 			return registerSize(type, 0);

 		}

 		

-		UNREACHABLE();

+		UNREACHABLE(0);

 		return 0;

 	}

 

@@ -1571,7 +1571,7 @@
 						{

 							parameter.index += right->getAsConstantUnion()->getIConst(0);

 						}

-						else UNREACHABLE();

+						else UNREACHABLE(binary->getOp());

 					}

 				}

 			}

@@ -1695,7 +1695,7 @@
 						dst.index += rightIndex * result->totalRegisterCount();

 						return 0xE4;

 					}

-					else UNREACHABLE();

+					else UNREACHABLE(0);

 				}

 				break;

 			case EOpIndexIndirect:

@@ -1758,7 +1758,7 @@
 							}

 						}

 					}

-					else UNREACHABLE();

+					else UNREACHABLE(0);

 				}

 				break;

 			case EOpIndexDirectStruct:

@@ -1805,7 +1805,7 @@
 				}

 				break;

 			default:

-				UNREACHABLE();   // Not an l-value operator

+				UNREACHABLE(binary->getOp());   // Not an l-value operator

 				break;

 			}

 		}

@@ -1865,7 +1865,7 @@
 		case EvqPointCoord:          return sw::Shader::PARAMETER_INPUT;

 		case EvqFragColor:           return sw::Shader::PARAMETER_COLOROUT;

 		case EvqFragData:            return sw::Shader::PARAMETER_COLOROUT;

-		default: UNREACHABLE();

+		default: UNREACHABLE(qualifier);

 		}

 

 		return sw::Shader::PARAMETER_VOID;

@@ -1882,7 +1882,7 @@
 		{

 		case EvqTemporary:           return temporaryRegister(operand);

 		case EvqGlobal:              return temporaryRegister(operand);

-		case EvqConstExpr:           UNREACHABLE();

+		case EvqConstExpr:           UNREACHABLE(EvqConstExpr);

 		case EvqAttribute:           return attributeRegister(operand);

 		case EvqVaryingIn:           return varyingRegister(operand);

 		case EvqVaryingOut:          return varyingRegister(operand);

@@ -1905,7 +1905,7 @@
 		case EvqPointCoord:          return varyingRegister(operand);

 		case EvqFragColor:           return 0;

 		case EvqFragData:            return 0;

-		default: UNREACHABLE();

+		default: UNREACHABLE(operand->getQualifier());

 		}

 

 		return 0;

@@ -2111,7 +2111,7 @@
 					// Semantic indexes for user varyings will be assigned during program link to match the pixel shader

 				}

 			}

-			else UNREACHABLE();

+			else UNREACHABLE(0);

 

 			declareVarying(varying, var);

 		}

@@ -2223,7 +2223,7 @@
 

 			return samplerRegister(binary->getLeft());   // Index added later

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(0);

 

 		return 0;

 	}

@@ -2411,7 +2411,7 @@
 				case 2: return GL_FLOAT_VEC2;

 				case 3: return GL_FLOAT_VEC3;

 				case 4: return GL_FLOAT_VEC4;

-				default: UNREACHABLE();

+				default: UNREACHABLE(type.getNominalSize());

 				}

 			}

 			else if(type.isMatrix())

@@ -2424,7 +2424,7 @@
 					case 2: return GL_FLOAT_MAT2;

 					case 3: return GL_FLOAT_MAT2x3;

 					case 4: return GL_FLOAT_MAT2x4;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type.getSecondarySize());

 					}

 				case 3:

 					switch(type.getSecondarySize())

@@ -2432,7 +2432,7 @@
 					case 2: return GL_FLOAT_MAT3x2;

 					case 3: return GL_FLOAT_MAT3;

 					case 4: return GL_FLOAT_MAT3x4;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type.getSecondarySize());

 					}

 				case 4:

 					switch(type.getSecondarySize())

@@ -2440,12 +2440,12 @@
 					case 2: return GL_FLOAT_MAT4x2;

 					case 3: return GL_FLOAT_MAT4x3;

 					case 4: return GL_FLOAT_MAT4;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type.getSecondarySize());

 					}

-				default: UNREACHABLE();

+				default: UNREACHABLE(type.getNominalSize());

 				}

 			}

-			else UNREACHABLE();

+			else UNREACHABLE(0);

 			break;

 		case EbtInt:

 			if(type.isScalar())

@@ -2459,10 +2459,10 @@
 				case 2: return GL_INT_VEC2;

 				case 3: return GL_INT_VEC3;

 				case 4: return GL_INT_VEC4;

-				default: UNREACHABLE();

+				default: UNREACHABLE(type.getNominalSize());

 				}

 			}

-			else UNREACHABLE();

+			else UNREACHABLE(0);

 			break;

 		case EbtUInt:

 			if(type.isScalar())

@@ -2476,10 +2476,10 @@
 				case 2: return GL_UNSIGNED_INT_VEC2;

 				case 3: return GL_UNSIGNED_INT_VEC3;

 				case 4: return GL_UNSIGNED_INT_VEC4;

-				default: UNREACHABLE();

+				default: UNREACHABLE(type.getNominalSize());

 				}

 			}

-			else UNREACHABLE();

+			else UNREACHABLE(0);

 			break;

 		case EbtBool:

 			if(type.isScalar())

@@ -2493,10 +2493,10 @@
 				case 2: return GL_BOOL_VEC2;

 				case 3: return GL_BOOL_VEC3;

 				case 4: return GL_BOOL_VEC4;

-				default: UNREACHABLE();

+				default: UNREACHABLE(type.getNominalSize());

 				}

 			}

-			else UNREACHABLE();

+			else UNREACHABLE(0);

 			break;

 		case EbtSampler2D:

 		case EbtISampler2D:

@@ -2517,7 +2517,7 @@
 		case EbtUSampler2DArray:

 			return GL_SAMPLER_2D_ARRAY;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(type.getBasicType());

 			break;

 		}

 

@@ -2535,19 +2535,19 @@
 			case EbpLow:    return GL_LOW_FLOAT;

 			case EbpUndefined:

 				// Should be defined as the default precision by the parser

-			default: UNREACHABLE();

+			default: UNREACHABLE(type.getPrecision());

 			}

 		}

 		else if(type.getBasicType() == EbtInt)

 		{

-			switch (type.getPrecision())

+			switch(type.getPrecision())

 			{

 			case EbpHigh:   return GL_HIGH_INT;

 			case EbpMedium: return GL_MEDIUM_INT;

 			case EbpLow:    return GL_LOW_INT;

 			case EbpUndefined:

 				// Should be defined as the default precision by the parser

-			default: UNREACHABLE();

+			default: UNREACHABLE(type.getPrecision());

 			}

 		}

 

@@ -2743,7 +2743,7 @@
 		case EOpReturn:

 			loopDiscontinuity = true;

 			break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(node->getFlowOp());

 		}

 

 		return !loopDiscontinuity;

diff --git a/src/OpenGL/compiler/ParseHelper.cpp b/src/OpenGL/compiler/ParseHelper.cpp
index a0c10da..efc01c3 100644
--- a/src/OpenGL/compiler/ParseHelper.cpp
+++ b/src/OpenGL/compiler/ParseHelper.cpp
@@ -709,16 +709,16 @@
 	return false;
 }
 
-bool TParseContext::layoutLocationErrorCheck(const TSourceLoc &location, const TLayoutQualifier &layoutQualifier)

-{

-	if(layoutQualifier.location != -1)

-	{

-		error(location, "invalid layout qualifier:", "location", "only valid on program inputs and outputs");

-		return true;

-	}

-

-	return false;

-}

+bool TParseContext::layoutLocationErrorCheck(const TSourceLoc &location, const TLayoutQualifier &layoutQualifier)
+{
+	if(layoutQualifier.location != -1)
+	{
+		error(location, "invalid layout qualifier:", "location", "only valid on program inputs and outputs");
+		return true;
+	}
+
+	return false;
+}
 
 bool TParseContext::locationDeclaratorListCheck(const TSourceLoc& line, const TPublicType &pType)
 {
@@ -2616,28 +2616,28 @@
 			mergedQualifier = EvqSmoothIn;
 		else if(interpolationQualifier == EvqFlat)
 			mergedQualifier = EvqFlatIn;
-		else UNREACHABLE();
+		else UNREACHABLE(interpolationQualifier);
 	}
 	else if(storageQualifier == EvqCentroidIn) {
 		if(interpolationQualifier == EvqSmooth)
 			mergedQualifier = EvqCentroidIn;
 		else if(interpolationQualifier == EvqFlat)
 			mergedQualifier = EvqFlatIn;
-		else UNREACHABLE();
+		else UNREACHABLE(interpolationQualifier);
 	}
 	else if(storageQualifier == EvqVertexOut) {
 		if(interpolationQualifier == EvqSmooth)
 			mergedQualifier = EvqSmoothOut;
 		else if(interpolationQualifier == EvqFlat)
 			mergedQualifier = EvqFlatOut;
-		else UNREACHABLE();
+		else UNREACHABLE(interpolationQualifier);
 	}
 	else if(storageQualifier == EvqCentroidOut) {
 		if(interpolationQualifier == EvqSmooth)
 			mergedQualifier = EvqCentroidOut;
 		else if(interpolationQualifier == EvqFlat)
 			mergedQualifier = EvqFlatOut;
-		else UNREACHABLE();
+		else UNREACHABLE(interpolationQualifier);
 	}
 	else {
 		error(interpolationLoc, "interpolation qualifier requires a fragment 'in' or vertex 'out' storage qualifier", getQualifierString(interpolationQualifier));
diff --git a/src/OpenGL/compiler/ValidateLimitations.cpp b/src/OpenGL/compiler/ValidateLimitations.cpp
index 269028c..833daeb 100644
--- a/src/OpenGL/compiler/ValidateLimitations.cpp
+++ b/src/OpenGL/compiler/ValidateLimitations.cpp
@@ -26,7 +26,7 @@
             return;
         }
     }
-    UNREACHABLE();
+    UNREACHABLE(0);
 }
 
 // Traverses a node to check if it represents a constant index expression.
@@ -88,7 +88,7 @@
                 MarkLoopForUnroll(symbol, mLoopStack);
                 break;
               default:
-                UNREACHABLE();
+                UNREACHABLE(symbol->getBasicType());
             }
         }
     }
diff --git a/src/OpenGL/compiler/debug.h b/src/OpenGL/compiler/debug.h
index 24cb6aa..c0c8152 100644
--- a/src/OpenGL/compiler/debug.h
+++ b/src/OpenGL/compiler/debug.h
@@ -39,22 +39,22 @@
 #endif  // TRACE_ENABLED
 
 // A macro asserting a condition and outputting failures to the debug log
-#undef ASSERT

+#undef ASSERT
 #define ASSERT(expression) do { \
     if(!(expression)) \
         Trace("Assert failed: %s(%d): "#expression"\n", __FUNCTION__, __LINE__); \
     assert(expression); \
 } while(0)
 
-#undef UNIMPLEMENTED

+#undef UNIMPLEMENTED
 #define UNIMPLEMENTED() do { \
     Trace("Unimplemented invoked: %s(%d)\n", __FUNCTION__, __LINE__); \
     assert(false); \
 } while(0)
 
-#undef UNREACHABLE

-#define UNREACHABLE() do { \
-    Trace("Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__); \
+#undef UNREACHABLE
+#define UNREACHABLE(value) do { \
+    Trace("Unreachable reached: %s(%d). Value: %d\n", __FUNCTION__, __LINE__, value); \
     assert(false); \
 } while(0)
 
diff --git a/src/OpenGL/libEGL/Config.cpp b/src/OpenGL/libEGL/Config.cpp
index 81eb1c1..3fc7cc6 100644
--- a/src/OpenGL/libEGL/Config.cpp
+++ b/src/OpenGL/libEGL/Config.cpp
@@ -67,7 +67,7 @@
         mBindToTextureRGB = EGL_TRUE;
         break;
     default:
-        UNREACHABLE();   // Other formats should not be valid
+        UNREACHABLE(renderTargetFormat);   // Other formats should not be valid
     }
 
     mLuminanceSize = 0;
@@ -121,7 +121,7 @@
 //      mStencilSize = 8;
 //      break;
 	default:
-		UNREACHABLE();
+		UNREACHABLE(depthStencilFormat);
 	}
 
     mLevel = 0;
diff --git a/src/OpenGL/libEGL/Display.cpp b/src/OpenGL/libEGL/Display.cpp
index 2812d38..bf4b438 100644
--- a/src/OpenGL/libEGL/Display.cpp
+++ b/src/OpenGL/libEGL/Display.cpp
@@ -614,7 +614,7 @@
             displayMode.height = 0;
             displayMode.format = sw::FORMAT_X8R8G8B8;
         }
-        else UNREACHABLE();
+        else UNREACHABLE(platform);
 	#endif
 
 	return displayMode;
diff --git a/src/OpenGL/libGL/Context.cpp b/src/OpenGL/libGL/Context.cpp
index 635e8ab..69217d9 100644
--- a/src/OpenGL/libGL/Context.cpp
+++ b/src/OpenGL/libGL/Context.cpp
@@ -1213,7 +1213,7 @@
     {

         return static_cast<Texture2D*>(getSamplerTexture(mState.activeSampler, PROXY_TEXTURE_2D));

     }

-    else UNREACHABLE();

+    else UNREACHABLE(target);

 

     return 0;

 }

@@ -1234,7 +1234,7 @@
         case TEXTURE_2D:       return mTexture2DZero;

         case PROXY_TEXTURE_2D: return mProxyTexture2DZero;

         case TEXTURE_CUBE:     return mTextureCubeMapZero;

-        default: UNREACHABLE();

+        default: UNREACHABLE(type);

         }

     }

 

@@ -1276,53 +1276,53 @@
     // because it is stored as a float, despite the fact that the GL ES 2.0 spec names

     // GetIntegerv as its native query function. As it would require conversion in any

     // case, this should make no difference to the calling application.

-    switch (pname)

+    switch(pname)

     {

-      case GL_LINE_WIDTH:               *params = mState.lineWidth;            break;

-      case GL_SAMPLE_COVERAGE_VALUE:    *params = mState.sampleCoverageValue;  break;

-      case GL_DEPTH_CLEAR_VALUE:        *params = mState.depthClearValue;      break;

-      case GL_POLYGON_OFFSET_FACTOR:    *params = mState.polygonOffsetFactor;  break;

-      case GL_POLYGON_OFFSET_UNITS:     *params = mState.polygonOffsetUnits;   break;

-      case GL_ALIASED_LINE_WIDTH_RANGE:

+    case GL_LINE_WIDTH:               *params = mState.lineWidth;            break;

+    case GL_SAMPLE_COVERAGE_VALUE:    *params = mState.sampleCoverageValue;  break;

+    case GL_DEPTH_CLEAR_VALUE:        *params = mState.depthClearValue;      break;

+    case GL_POLYGON_OFFSET_FACTOR:    *params = mState.polygonOffsetFactor;  break;

+    case GL_POLYGON_OFFSET_UNITS:     *params = mState.polygonOffsetUnits;   break;

+    case GL_ALIASED_LINE_WIDTH_RANGE:

         params[0] = ALIASED_LINE_WIDTH_RANGE_MIN;

         params[1] = ALIASED_LINE_WIDTH_RANGE_MAX;

         break;

-      case GL_ALIASED_POINT_SIZE_RANGE:

+    case GL_ALIASED_POINT_SIZE_RANGE:

         params[0] = ALIASED_POINT_SIZE_RANGE_MIN;

         params[1] = ALIASED_POINT_SIZE_RANGE_MAX;

         break;

-      case GL_DEPTH_RANGE:

+    case GL_DEPTH_RANGE:

         params[0] = mState.zNear;

         params[1] = mState.zFar;

         break;

-      case GL_COLOR_CLEAR_VALUE:

+    case GL_COLOR_CLEAR_VALUE:

         params[0] = mState.colorClearValue.red;

         params[1] = mState.colorClearValue.green;

         params[2] = mState.colorClearValue.blue;

         params[3] = mState.colorClearValue.alpha;

         break;

-      case GL_BLEND_COLOR:

+    case GL_BLEND_COLOR:

         params[0] = mState.blendColor.red;

         params[1] = mState.blendColor.green;

         params[2] = mState.blendColor.blue;

         params[3] = mState.blendColor.alpha;

         break;

-	  case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:

+	case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:

         *params = MAX_TEXTURE_MAX_ANISOTROPY;

 		break;

-	  case GL_MODELVIEW_MATRIX:

+	case GL_MODELVIEW_MATRIX:

 		for(int i = 0; i < 16; i++)

 		{

 			params[i] = modelView.current()[i % 4][i / 4];

 		}

 		break;

-	  case GL_PROJECTION_MATRIX:

+	case GL_PROJECTION_MATRIX:

 		for(int i = 0; i < 16; i++)

 		{

 			params[i] = projection.current()[i % 4][i / 4];

 		}

 		break;

-      default:

+    default:

         return false;

     }

 

@@ -1544,159 +1544,159 @@
     // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we

     // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling

     // application.

-    switch (pname)

+    switch(pname)

     {

-      case GL_COMPRESSED_TEXTURE_FORMATS:

+    case GL_COMPRESSED_TEXTURE_FORMATS:

 		{

             *type = GL_INT;

 			*numParams = NUM_COMPRESSED_TEXTURE_FORMATS;

         }

 		break;

-      case GL_SHADER_BINARY_FORMATS:

+    case GL_SHADER_BINARY_FORMATS:

         {

             *type = GL_INT;

             *numParams = 0;

         }

         break;

-      case GL_MAX_VERTEX_ATTRIBS:

-      case GL_MAX_VERTEX_UNIFORM_VECTORS:

-      case GL_MAX_VARYING_VECTORS:

-      case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:

-      case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:

-      case GL_MAX_TEXTURE_IMAGE_UNITS:

-      case GL_MAX_FRAGMENT_UNIFORM_VECTORS:

-      case GL_MAX_RENDERBUFFER_SIZE:

-      case GL_NUM_SHADER_BINARY_FORMATS:

-      case GL_NUM_COMPRESSED_TEXTURE_FORMATS:

-      case GL_ARRAY_BUFFER_BINDING:

-      case GL_FRAMEBUFFER_BINDING:

-      case GL_RENDERBUFFER_BINDING:

-      case GL_CURRENT_PROGRAM:

-      case GL_PACK_ALIGNMENT:

-      case GL_UNPACK_ALIGNMENT:

-      case GL_GENERATE_MIPMAP_HINT:

-      case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:

-      case GL_RED_BITS:

-      case GL_GREEN_BITS:

-      case GL_BLUE_BITS:

-      case GL_ALPHA_BITS:

-      case GL_DEPTH_BITS:

-      case GL_STENCIL_BITS:

-      case GL_ELEMENT_ARRAY_BUFFER_BINDING:

-      case GL_CULL_FACE_MODE:

-      case GL_FRONT_FACE:

-      case GL_ACTIVE_TEXTURE:

-      case GL_STENCIL_FUNC:

-      case GL_STENCIL_VALUE_MASK:

-      case GL_STENCIL_REF:

-      case GL_STENCIL_FAIL:

-      case GL_STENCIL_PASS_DEPTH_FAIL:

-      case GL_STENCIL_PASS_DEPTH_PASS:

-      case GL_STENCIL_BACK_FUNC:

-      case GL_STENCIL_BACK_VALUE_MASK:

-      case GL_STENCIL_BACK_REF:

-      case GL_STENCIL_BACK_FAIL:

-      case GL_STENCIL_BACK_PASS_DEPTH_FAIL:

-      case GL_STENCIL_BACK_PASS_DEPTH_PASS:

-      case GL_DEPTH_FUNC:

-      case GL_BLEND_SRC_RGB:

-      case GL_BLEND_SRC_ALPHA:

-      case GL_BLEND_DST_RGB:

-      case GL_BLEND_DST_ALPHA:

-      case GL_BLEND_EQUATION_RGB:

-      case GL_BLEND_EQUATION_ALPHA:

-      case GL_STENCIL_WRITEMASK:

-      case GL_STENCIL_BACK_WRITEMASK:

-      case GL_STENCIL_CLEAR_VALUE:

-      case GL_SUBPIXEL_BITS:

-      case GL_MAX_TEXTURE_SIZE:

-      case GL_MAX_CUBE_MAP_TEXTURE_SIZE:

-      case GL_SAMPLE_BUFFERS:

-      case GL_SAMPLES:

-      case GL_IMPLEMENTATION_COLOR_READ_TYPE:

-      case GL_IMPLEMENTATION_COLOR_READ_FORMAT:

-      case GL_TEXTURE_BINDING_2D:

-      case GL_TEXTURE_BINDING_CUBE_MAP:

-      case GL_MAX_VERTEX_UNIFORM_COMPONENTS:

-      case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:

-      case GL_MAX_ARRAY_TEXTURE_LAYERS:

+    case GL_MAX_VERTEX_ATTRIBS:

+    case GL_MAX_VERTEX_UNIFORM_VECTORS:

+    case GL_MAX_VARYING_VECTORS:

+    case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:

+    case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:

+    case GL_MAX_TEXTURE_IMAGE_UNITS:

+    case GL_MAX_FRAGMENT_UNIFORM_VECTORS:

+    case GL_MAX_RENDERBUFFER_SIZE:

+    case GL_NUM_SHADER_BINARY_FORMATS:

+    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:

+    case GL_ARRAY_BUFFER_BINDING:

+    case GL_FRAMEBUFFER_BINDING:

+    case GL_RENDERBUFFER_BINDING:

+    case GL_CURRENT_PROGRAM:

+    case GL_PACK_ALIGNMENT:

+    case GL_UNPACK_ALIGNMENT:

+    case GL_GENERATE_MIPMAP_HINT:

+    case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:

+    case GL_RED_BITS:

+    case GL_GREEN_BITS:

+    case GL_BLUE_BITS:

+    case GL_ALPHA_BITS:

+    case GL_DEPTH_BITS:

+    case GL_STENCIL_BITS:

+    case GL_ELEMENT_ARRAY_BUFFER_BINDING:

+    case GL_CULL_FACE_MODE:

+    case GL_FRONT_FACE:

+    case GL_ACTIVE_TEXTURE:

+    case GL_STENCIL_FUNC:

+    case GL_STENCIL_VALUE_MASK:

+    case GL_STENCIL_REF:

+    case GL_STENCIL_FAIL:

+    case GL_STENCIL_PASS_DEPTH_FAIL:

+    case GL_STENCIL_PASS_DEPTH_PASS:

+    case GL_STENCIL_BACK_FUNC:

+    case GL_STENCIL_BACK_VALUE_MASK:

+    case GL_STENCIL_BACK_REF:

+    case GL_STENCIL_BACK_FAIL:

+    case GL_STENCIL_BACK_PASS_DEPTH_FAIL:

+    case GL_STENCIL_BACK_PASS_DEPTH_PASS:

+    case GL_DEPTH_FUNC:

+    case GL_BLEND_SRC_RGB:

+    case GL_BLEND_SRC_ALPHA:

+    case GL_BLEND_DST_RGB:

+    case GL_BLEND_DST_ALPHA:

+    case GL_BLEND_EQUATION_RGB:

+    case GL_BLEND_EQUATION_ALPHA:

+    case GL_STENCIL_WRITEMASK:

+    case GL_STENCIL_BACK_WRITEMASK:

+    case GL_STENCIL_CLEAR_VALUE:

+    case GL_SUBPIXEL_BITS:

+    case GL_MAX_TEXTURE_SIZE:

+    case GL_MAX_CUBE_MAP_TEXTURE_SIZE:

+    case GL_SAMPLE_BUFFERS:

+    case GL_SAMPLES:

+    case GL_IMPLEMENTATION_COLOR_READ_TYPE:

+    case GL_IMPLEMENTATION_COLOR_READ_FORMAT:

+    case GL_TEXTURE_BINDING_2D:

+    case GL_TEXTURE_BINDING_CUBE_MAP:

+    case GL_MAX_VERTEX_UNIFORM_COMPONENTS:

+    case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:

+    case GL_MAX_ARRAY_TEXTURE_LAYERS:

         {

             *type = GL_INT;

             *numParams = 1;

         }

         break;

-      case GL_MAX_SAMPLES:

+    case GL_MAX_SAMPLES:

         {

             *type = GL_INT;

             *numParams = 1;

         }

         break;

-      case GL_MAX_VIEWPORT_DIMS:

+    case GL_MAX_VIEWPORT_DIMS:

         {

             *type = GL_INT;

             *numParams = 2;

         }

         break;

-      case GL_VIEWPORT:

-      case GL_SCISSOR_BOX:

+    case GL_VIEWPORT:

+    case GL_SCISSOR_BOX:

         {

             *type = GL_INT;

             *numParams = 4;

         }

         break;

-      case GL_SHADER_COMPILER:

-      case GL_SAMPLE_COVERAGE_INVERT:

-      case GL_DEPTH_WRITEMASK:

-      case GL_CULL_FACE:                // CULL_FACE through DITHER are natural to IsEnabled,

-      case GL_POLYGON_OFFSET_FILL:      // but can be retrieved through the Get{Type}v queries.

-      case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural

-      case GL_SAMPLE_COVERAGE:

-      case GL_SCISSOR_TEST:

-      case GL_STENCIL_TEST:

-      case GL_DEPTH_TEST:

-      case GL_BLEND:

-      case GL_DITHER:

+    case GL_SHADER_COMPILER:

+    case GL_SAMPLE_COVERAGE_INVERT:

+    case GL_DEPTH_WRITEMASK:

+    case GL_CULL_FACE:                // CULL_FACE through DITHER are natural to IsEnabled,

+    case GL_POLYGON_OFFSET_FILL:      // but can be retrieved through the Get{Type}v queries.

+    case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural

+    case GL_SAMPLE_COVERAGE:

+    case GL_SCISSOR_TEST:

+    case GL_STENCIL_TEST:

+    case GL_DEPTH_TEST:

+    case GL_BLEND:

+    case GL_DITHER:

         {

             *type = GL_BOOL;

             *numParams = 1;

         }

         break;

-      case GL_COLOR_WRITEMASK:

+    case GL_COLOR_WRITEMASK:

         {

             *type = GL_BOOL;

             *numParams = 4;

         }

         break;

-      case GL_POLYGON_OFFSET_FACTOR:

-      case GL_POLYGON_OFFSET_UNITS:

-      case GL_SAMPLE_COVERAGE_VALUE:

-      case GL_DEPTH_CLEAR_VALUE:

-      case GL_LINE_WIDTH:

+    case GL_POLYGON_OFFSET_FACTOR:

+    case GL_POLYGON_OFFSET_UNITS:

+    case GL_SAMPLE_COVERAGE_VALUE:

+    case GL_DEPTH_CLEAR_VALUE:

+    case GL_LINE_WIDTH:

         {

             *type = GL_FLOAT;

             *numParams = 1;

         }

         break;

-      case GL_ALIASED_LINE_WIDTH_RANGE:

-      case GL_ALIASED_POINT_SIZE_RANGE:

-      case GL_DEPTH_RANGE:

+    case GL_ALIASED_LINE_WIDTH_RANGE:

+    case GL_ALIASED_POINT_SIZE_RANGE:

+    case GL_DEPTH_RANGE:

         {

             *type = GL_FLOAT;

             *numParams = 2;

         }

         break;

-      case GL_COLOR_CLEAR_VALUE:

-      case GL_BLEND_COLOR:

+    case GL_COLOR_CLEAR_VALUE:

+    case GL_BLEND_COLOR:

         {

             *type = GL_FLOAT;

             *numParams = 4;

         }

         break;

-	  case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:

+	case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:

         *type = GL_FLOAT;

         *numParams = 1;

         break;

-      default:

+    default:

         return false;

     }

 

@@ -2145,7 +2145,7 @@
 	{

 		textureUsed = program ? program->getVertexShader()->usesSampler(index) : false;

 	}

-	else UNREACHABLE();

+	else UNREACHABLE(type);

 

 	sw::Resource *resource = 0;

 

@@ -2344,7 +2344,7 @@
 					break;

 				default:

 					UNIMPLEMENTED();   // FIXME

-					UNREACHABLE();

+					UNREACHABLE(renderTarget->getInternalFormat());

 				}

 

 				switch(format)

@@ -2358,7 +2358,7 @@
 						dest[4 * i + j * outputPitch + 2] = (unsigned char)(255 * b + 0.5f);

 						dest[4 * i + j * outputPitch + 3] = (unsigned char)(255 * a + 0.5f);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type);

 					}

 					break;

 				case GL_BGRA_EXT:

@@ -2398,7 +2398,7 @@
 							((unsigned short)(31 * g + 0.5f) << 5) |

 							((unsigned short)(31 * b + 0.5f) << 0);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type);

 					}

 					break;

 				case GL_RGB:   // IMPLEMENTATION_COLOR_READ_FORMAT

@@ -2410,10 +2410,10 @@
 							((unsigned short)(63 * g + 0.5f) << 5) |

 							((unsigned short)(31 * r + 0.5f) << 11);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type);

 					}

 					break;

-				default: UNREACHABLE();

+				default: UNREACHABLE(format);

 				}

 			}

         }

@@ -2796,7 +2796,7 @@
       case GL_LINE_LOOP:

       case GL_LINE_STRIP:

         return false;

-      default: UNREACHABLE();

+      default: UNREACHABLE(drawMode);

     }

 

     return false;

@@ -3095,7 +3095,7 @@
 	case GL_MODELVIEW:  return modelView;                     break;

 	case GL_PROJECTION: return projection;                    break;

 	case GL_TEXTURE:    return texture[mState.activeSampler]; break;

-	default:            UNREACHABLE(); return modelView;      break;

+	default:            UNREACHABLE(matrixMode); return modelView;      break;

 	}

 }

 

@@ -3252,7 +3252,7 @@
 	case GL_NOTEQUAL: device->setAlphaCompare(sw::ALPHA_NOTEQUAL);     break;

 	case GL_GEQUAL:   device->setAlphaCompare(sw::ALPHA_GREATEREQUAL); break;

 	case GL_ALWAYS:   device->setAlphaCompare(sw::ALPHA_ALWAYS);       break;

-	default: UNREACHABLE();

+	default: UNREACHABLE(func);

 	}

 

 	device->setAlphaReference(gl::clamp01(ref));

@@ -3578,7 +3578,7 @@
         UNIMPLEMENTED();

         break;

     default:

-        UNREACHABLE();

+        UNREACHABLE(drawMode);

     }

 

 	restoreAttribs();

@@ -3626,7 +3626,7 @@
         device->setEmissiveMaterialSource(sw::MATERIAL_MATERIAL);

         break;

     default:

-        UNREACHABLE();

+        UNREACHABLE(mode);

     }

 }

 

diff --git a/src/OpenGL/libGL/Context.h b/src/OpenGL/libGL/Context.h
index 6a9e42c..893047b 100644
--- a/src/OpenGL/libGL/Context.h
+++ b/src/OpenGL/libGL/Context.h
@@ -371,7 +371,7 @@
 

     int typeSize() const

     {

-        switch (mType)

+        switch(mType)

         {

         case GL_BYTE:           return mSize * sizeof(GLbyte);

         case GL_UNSIGNED_BYTE:  return mSize * sizeof(GLubyte);

@@ -379,7 +379,7 @@
         case GL_UNSIGNED_SHORT: return mSize * sizeof(GLushort);

         case GL_FIXED:          return mSize * sizeof(GLfixed);

         case GL_FLOAT:          return mSize * sizeof(GLfloat);

-        default: UNREACHABLE(); return mSize * sizeof(GLfloat);

+        default: UNREACHABLE(mType); return mSize * sizeof(GLfloat);

         }

     }

 

diff --git a/src/OpenGL/libGL/Device.cpp b/src/OpenGL/libGL/Device.cpp
index 1979141..b683318 100644
--- a/src/OpenGL/libGL/Device.cpp
+++ b/src/OpenGL/libGL/Device.cpp
@@ -278,7 +278,7 @@
 			lockable = true;

 			break;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(format);

 		}

 

 		Image *surface = new Image(0, width, height, format, multiSampleDepth, lockable, true);

@@ -331,7 +331,7 @@
 			case DRAW_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST32;  break;

 			case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP32; break;

 			case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN32;	  break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(type);

 			}

 		}

 		else if(indexSize == 2)

@@ -345,7 +345,7 @@
 			case DRAW_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST16;  break;

 			case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP16; break;

 			case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN16;   break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(type);

 			}

 		}

 		else if(indexSize == 1)

@@ -359,10 +359,10 @@
 			case DRAW_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST8;  break;

 			case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP8; break;

 			case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN8;   break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(type);

 			}

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(indexSize);

 

 		draw(drawType, indexOffset, primitiveCount);

 	}

@@ -388,7 +388,7 @@
 		case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_TRIANGLESTRIP; break;

 		case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_TRIANGLEFAN;   break;

         case DRAW_QUADLIST:      drawType = sw::DRAW_QUADLIST;      break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(primitiveType);

 		}

 

 		draw(drawType, 0, primitiveCount);

diff --git a/src/OpenGL/libGL/Framebuffer.cpp b/src/OpenGL/libGL/Framebuffer.cpp
index 048a70a..220da2d 100644
--- a/src/OpenGL/libGL/Framebuffer.cpp
+++ b/src/OpenGL/libGL/Framebuffer.cpp
@@ -53,10 +53,7 @@
 	{
 		buffer = context->getTexture(handle)->getRenderbuffer(type);
 	}
-	else
-	{
-		UNREACHABLE();
-	}
+	else UNREACHABLE(type);
 
 	return buffer;
 }
@@ -269,7 +266,7 @@
 		}
 		else
 		{
-			UNREACHABLE();
+			UNREACHABLE(mColorbufferType);
 			return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 		}
 
@@ -311,7 +308,7 @@
 		}
 		else
 		{
-			UNREACHABLE();
+			UNREACHABLE(mDepthbufferType);
 			return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 		}
 
@@ -363,7 +360,7 @@
 		}
 		else
 		{
-			UNREACHABLE();
+			UNREACHABLE(mStencilbufferType);
 			return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 		}
 
diff --git a/src/OpenGL/libGL/Image.cpp b/src/OpenGL/libGL/Image.cpp
index 94829bb..b01712a 100644
--- a/src/OpenGL/libGL/Image.cpp
+++ b/src/OpenGL/libGL/Image.cpp
@@ -186,7 +186,7 @@
 			{
 				return sw::FORMAT_A8;
 			}
-			else UNREACHABLE();
+			else UNREACHABLE(format);
 		}
 		else if(type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT)
 		{
@@ -194,7 +194,7 @@
 			{
 				return sw::FORMAT_D32FS8_TEXTURE;
 			}
-			else UNREACHABLE();
+			else UNREACHABLE(format);
 		}
 		else if(type == GL_UNSIGNED_INT_24_8_EXT)
 		{
@@ -202,7 +202,7 @@
 			{
 				return sw::FORMAT_D32FS8_TEXTURE;
 			}
-			else UNREACHABLE();
+			else UNREACHABLE(format);
 		}
 		else if(type == GL_UNSIGNED_SHORT_4_4_4_4)
 		{
@@ -221,7 +221,7 @@
             return sw::FORMAT_A8R8G8B8;
         }
 
-		else UNREACHABLE();
+		else UNREACHABLE(type);
 
 		return sw::FORMAT_A8R8G8B8;
 	}
@@ -257,7 +257,7 @@
 				case GL_BGRA_EXT:
 					loadBGRAImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
 					break;
-				default: UNREACHABLE();
+				default: UNREACHABLE(format);
 				}
 				break;
 			case GL_UNSIGNED_SHORT_5_6_5:
@@ -266,7 +266,7 @@
 				case GL_RGB:
 					loadRGB565ImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
 					break;
-				default: UNREACHABLE();
+				default: UNREACHABLE(format);
 				}
 				break;
 			case GL_UNSIGNED_SHORT_4_4_4_4:
@@ -275,7 +275,7 @@
 				case GL_RGBA:
 					loadRGBA4444ImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
 					break;
-				default: UNREACHABLE();
+				default: UNREACHABLE(format);
 				}
 				break;
 			case GL_UNSIGNED_SHORT_5_5_5_1:
@@ -284,7 +284,7 @@
 				case GL_RGBA:
 					loadRGBA5551ImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
 					break;
-				default: UNREACHABLE();
+				default: UNREACHABLE(format);
 				}
 				break;
 			case GL_FLOAT:
@@ -306,10 +306,10 @@
 				case GL_RGBA:
 					loadRGBAFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
 					break;
-				default: UNREACHABLE();
+				default: UNREACHABLE(format);
 				}
 				break;
-			  case GL_HALF_FLOAT:
+			case GL_HALF_FLOAT:
 				switch(format)
 				{
 				// float textures are converted to RGBA, not BGRA
@@ -328,7 +328,7 @@
 				case GL_RGBA:
 					loadRGBAHalfFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
 					break;
-				default: UNREACHABLE();
+				default: UNREACHABLE(format);
 				}
 				break;
 			case GL_UNSIGNED_SHORT:
@@ -340,7 +340,7 @@
 			case GL_UNSIGNED_INT_24_8_EXT:
 				loadD24S8ImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
 				break;
-			default: UNREACHABLE();
+			default: UNREACHABLE(type);
 			}
 		}
 
diff --git a/src/OpenGL/libGL/IndexDataManager.cpp b/src/OpenGL/libGL/IndexDataManager.cpp
index 3dbfe44..492122d 100644
--- a/src/OpenGL/libGL/IndexDataManager.cpp
+++ b/src/OpenGL/libGL/IndexDataManager.cpp
@@ -57,7 +57,7 @@
     {

         memcpy(output, input, count * sizeof(GLushort));

     }

-    else UNREACHABLE();

+    else UNREACHABLE(type);

 }

 

 template<class IndexType>

@@ -87,7 +87,7 @@
     {

         computeRange(static_cast<const GLushort*>(indices), count, minIndex, maxIndex);

     }

-    else UNREACHABLE();

+    else UNREACHABLE(type);

 }

 

 GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, Buffer *buffer, const void *indices, TranslatedIndexData *translated)

@@ -107,7 +107,7 @@
           case GL_UNSIGNED_BYTE:  alignedOffset = (offset % sizeof(GLubyte) == 0);  break;

           case GL_UNSIGNED_SHORT: alignedOffset = (offset % sizeof(GLushort) == 0); break;

           case GL_UNSIGNED_INT:   alignedOffset = (offset % sizeof(GLuint) == 0);   break;

-          default: UNREACHABLE(); alignedOffset = false;

+          default: UNREACHABLE(type); alignedOffset = false;

         }

 

         if(typeSize(type) * count + offset > static_cast<std::size_t>(buffer->size()))

@@ -162,7 +162,7 @@
     case GL_UNSIGNED_INT:   return sizeof(GLuint);

     case GL_UNSIGNED_SHORT: return sizeof(GLushort);

     case GL_UNSIGNED_BYTE:  return sizeof(GLubyte);

-    default: UNREACHABLE(); return sizeof(GLushort);

+    default: UNREACHABLE(type); return sizeof(GLushort);

     }

 }

 

diff --git a/src/OpenGL/libGL/Program.cpp b/src/OpenGL/libGL/Program.cpp
index 21b7995..777b1b3 100644
--- a/src/OpenGL/libGL/Program.cpp
+++ b/src/OpenGL/libGL/Program.cpp
@@ -125,7 +125,7 @@
 			fragmentShader = (FragmentShader*)shader;

 			fragmentShader->addRef();

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(shader->getType());

 

 		return true;

 	}

@@ -152,7 +152,7 @@
 			fragmentShader->release();

 			fragmentShader = 0;

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(shader->getType());

 

 		return true;

 	}

@@ -231,7 +231,7 @@
 				logicalTextureUnit = samplersVS[samplerIndex].logicalTextureUnit;

 			}

 			break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(type);

 		}

 

 		if(logicalTextureUnit >= 0 && logicalTextureUnit < MAX_COMBINED_TEXTURE_IMAGE_UNITS)

@@ -255,7 +255,7 @@
 			ASSERT(samplerIndex < sizeof(samplersVS)/sizeof(samplersVS[0]));

 			ASSERT(samplersVS[samplerIndex].active);

 			return samplersVS[samplerIndex].textureType;

-		default: UNREACHABLE();

+		default: UNREACHABLE(type);

 		}

 

 		return TEXTURE_2D;

@@ -799,9 +799,9 @@
 			return false;

 		}

 

-		switch (UniformComponentType(targetUniform->type))

+		switch(UniformComponentType(targetUniform->type))

 		{

-		  case GL_BOOL:

+		case GL_BOOL:

 			{

 				GLboolean *boolParams = (GLboolean*)targetUniform->data + uniformIndex[location].element * count;

 

@@ -811,11 +811,11 @@
 				}

 			}

 			break;

-		  case GL_FLOAT:

+		case GL_FLOAT:

 			memcpy(params, targetUniform->data + uniformIndex[location].element * count * sizeof(GLfloat),

 				   count * sizeof(GLfloat));

 			break;

-		  case GL_INT:

+		case GL_INT:

 			{

 				GLint *intParams = (GLint*)targetUniform->data + uniformIndex[location].element * count;

 

@@ -825,7 +825,7 @@
 				}

 			}

 			break;

-		  default: UNREACHABLE();

+		default: UNREACHABLE(targetUniform->type);

 		}

 

 		return true;

@@ -847,9 +847,9 @@
 			return false;

 		}

 

-		switch (UniformComponentType(targetUniform->type))

+		switch(UniformComponentType(targetUniform->type))

 		{

-		  case GL_BOOL:

+		case GL_BOOL:

 			{

 				GLboolean *boolParams = targetUniform->data + uniformIndex[location].element * count;

 

@@ -859,7 +859,7 @@
 				}

 			}

 			break;

-		  case GL_FLOAT:

+		case GL_FLOAT:

 			{

 				GLfloat *floatParams = (GLfloat*)targetUniform->data + uniformIndex[location].element * count;

 

@@ -869,11 +869,11 @@
 				}

 			}

 			break;

-		  case GL_INT:

+		case GL_INT:

 			memcpy(params, targetUniform->data + uniformIndex[location].element * count * sizeof(GLint),

 				   count * sizeof(GLint));

 			break;

-		  default: UNREACHABLE();

+		default: UNREACHABLE(targetUniform->type);

 		}

 

 		return true;

@@ -910,25 +910,25 @@
 

 				switch(targetUniform->type)

 				{

-				  case GL_BOOL:       applyUniform1bv(location, size, b);       break;

-				  case GL_BOOL_VEC2:  applyUniform2bv(location, size, b);       break;

-				  case GL_BOOL_VEC3:  applyUniform3bv(location, size, b);       break;

-				  case GL_BOOL_VEC4:  applyUniform4bv(location, size, b);       break;

-				  case GL_FLOAT:      applyUniform1fv(location, size, f);       break;

-				  case GL_FLOAT_VEC2: applyUniform2fv(location, size, f);       break;

-				  case GL_FLOAT_VEC3: applyUniform3fv(location, size, f);       break;

-				  case GL_FLOAT_VEC4: applyUniform4fv(location, size, f);       break;

-				  case GL_FLOAT_MAT2: applyUniformMatrix2fv(location, size, f); break;

-				  case GL_FLOAT_MAT3: applyUniformMatrix3fv(location, size, f); break;

-				  case GL_FLOAT_MAT4: applyUniformMatrix4fv(location, size, f); break;

-				  case GL_SAMPLER_2D:

-				  case GL_SAMPLER_CUBE:

-				  case GL_INT:        applyUniform1iv(location, size, i);       break;

-				  case GL_INT_VEC2:   applyUniform2iv(location, size, i);       break;

-				  case GL_INT_VEC3:   applyUniform3iv(location, size, i);       break;

-				  case GL_INT_VEC4:   applyUniform4iv(location, size, i);       break;

-				  default:

-					UNREACHABLE();

+				case GL_BOOL:       applyUniform1bv(location, size, b);       break;

+				case GL_BOOL_VEC2:  applyUniform2bv(location, size, b);       break;

+				case GL_BOOL_VEC3:  applyUniform3bv(location, size, b);       break;

+				case GL_BOOL_VEC4:  applyUniform4bv(location, size, b);       break;

+				case GL_FLOAT:      applyUniform1fv(location, size, f);       break;

+				case GL_FLOAT_VEC2: applyUniform2fv(location, size, f);       break;

+				case GL_FLOAT_VEC3: applyUniform3fv(location, size, f);       break;

+				case GL_FLOAT_VEC4: applyUniform4fv(location, size, f);       break;

+				case GL_FLOAT_MAT2: applyUniformMatrix2fv(location, size, f); break;

+				case GL_FLOAT_MAT3: applyUniformMatrix3fv(location, size, f); break;

+				case GL_FLOAT_MAT4: applyUniformMatrix4fv(location, size, f); break;

+				case GL_SAMPLER_2D:

+				case GL_SAMPLER_CUBE:

+				case GL_INT:        applyUniform1iv(location, size, i);       break;

+				case GL_INT_VEC2:   applyUniform2iv(location, size, i);       break;

+				case GL_INT_VEC3:   applyUniform3iv(location, size, i);       break;

+				case GL_INT_VEC4:   applyUniform4iv(location, size, i);       break;

+				default:

+					UNREACHABLE(targetUniform->type);

 				}

 

 				targetUniform->dirty = false;

@@ -1059,7 +1059,7 @@
 					success = true;

 				}

 			}

-			else UNREACHABLE();

+			else UNREACHABLE(m);

 

 			if(!success)

 			{

@@ -1347,7 +1347,7 @@
 						return false;

 					}

 				}

-				else UNREACHABLE();

+				else UNREACHABLE(shader);

 

 				index++;

 			}

@@ -1391,7 +1391,7 @@
 		{

 			uniform->psRegisterIndex = registerIndex;

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(shader);

 

 		if(location == -1)   // Not previously defined

 		{

@@ -1420,7 +1420,7 @@
 				return false;

 			}

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(shader);

 

 		return true;

 	}

diff --git a/src/OpenGL/libGL/ResourceManager.cpp b/src/OpenGL/libGL/ResourceManager.cpp
index 383a66f..49352ae 100644
--- a/src/OpenGL/libGL/ResourceManager.cpp
+++ b/src/OpenGL/libGL/ResourceManager.cpp
@@ -103,7 +103,7 @@
     {
         mShaderMap[handle] = new FragmentShader(this, handle);
     }
-    else UNREACHABLE();
+    else UNREACHABLE(type);
 
     return handle;
 }
@@ -333,7 +333,7 @@
         }
         else
         {
-            UNREACHABLE();
+            UNREACHABLE(type);
             return;
         }
 
diff --git a/src/OpenGL/libGL/Shader.cpp b/src/OpenGL/libGL/Shader.cpp
index bb574a3..ec611cd 100644
--- a/src/OpenGL/libGL/Shader.cpp
+++ b/src/OpenGL/libGL/Shader.cpp
@@ -296,7 +296,7 @@
     {
         return GL_FLOAT_MAT4;
     }
-    else UNREACHABLE();
+    else UNREACHABLE(type);
 
     return GL_NONE;
 }
@@ -322,7 +322,7 @@
           case GL_FLOAT_VEC3: return true;
           case GL_FLOAT_VEC2: return true;
           case GL_FLOAT:      return true;
-          default: UNREACHABLE();
+          default: UNREACHABLE(y.type);
         }
         break;
       case GL_FLOAT_VEC4:
@@ -335,7 +335,7 @@
           case GL_FLOAT_VEC3: return true;
           case GL_FLOAT_VEC2: return true;
           case GL_FLOAT:      return true;
-          default: UNREACHABLE();
+          default: UNREACHABLE(y.type);
         }
         break;
       case GL_FLOAT_MAT3:
@@ -348,7 +348,7 @@
           case GL_FLOAT_VEC3: return true;
           case GL_FLOAT_VEC2: return true;
           case GL_FLOAT:      return true;
-          default: UNREACHABLE();
+          default: UNREACHABLE(y.type);
         }
         break;
       case GL_FLOAT_VEC3:
@@ -361,7 +361,7 @@
           case GL_FLOAT_VEC3: return true;
           case GL_FLOAT_VEC2: return true;
           case GL_FLOAT:      return true;
-          default: UNREACHABLE();
+          default: UNREACHABLE(y.type);
         }
         break;
       case GL_FLOAT_VEC2:
@@ -374,11 +374,11 @@
           case GL_FLOAT_VEC3: return false;
           case GL_FLOAT_VEC2: return true;
           case GL_FLOAT:      return true;
-          default: UNREACHABLE();
+          default: UNREACHABLE(y.type);
         }
         break;
       case GL_FLOAT: return false;
-      default: UNREACHABLE();
+      default: UNREACHABLE(x.type);
     }
 
     return false;
diff --git a/src/OpenGL/libGL/Texture.cpp b/src/OpenGL/libGL/Texture.cpp
index 74c1daa..e6b761d 100644
--- a/src/OpenGL/libGL/Texture.cpp
+++ b/src/OpenGL/libGL/Texture.cpp
@@ -263,7 +263,7 @@
     case GL_NEAREST_MIPMAP_LINEAR:

     case GL_LINEAR_MIPMAP_LINEAR:

         return true;

-    default: UNREACHABLE();

+    default: UNREACHABLE(mMinFilter);

     }

 

 	return false;

diff --git a/src/OpenGL/libGL/VertexDataManager.cpp b/src/OpenGL/libGL/VertexDataManager.cpp
index 1c8501c..f322487 100644
--- a/src/OpenGL/libGL/VertexDataManager.cpp
+++ b/src/OpenGL/libGL/VertexDataManager.cpp
@@ -181,7 +181,7 @@
 				case GL_UNSIGNED_SHORT: translated[i].type = sw::STREAMTYPE_USHORT; break;

 				case GL_FIXED:          translated[i].type = sw::STREAMTYPE_FIXED;  break;

 				case GL_FLOAT:          translated[i].type = sw::STREAMTYPE_FLOAT;  break;

-				default: UNREACHABLE(); translated[i].type = sw::STREAMTYPE_FLOAT;  break;

+				default: UNREACHABLE(attribs[i].mType); translated[i].type = sw::STREAMTYPE_FLOAT;  break;

 				}

 

 				translated[i].count = attribs[i].mSize;

diff --git a/src/OpenGL/libGL/libGL.cpp b/src/OpenGL/libGL/libGL.cpp
index c33294a..98101fc 100644
--- a/src/OpenGL/libGL/libGL.cpp
+++ b/src/OpenGL/libGL/libGL.cpp
@@ -897,7 +897,7 @@
 			case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:

 				texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);

 				break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(target);

 			}

 		}

 	}

@@ -984,10 +984,7 @@
 				texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);

 			}

 		}

-		else

-		{

-			UNREACHABLE();

-		}

+		else UNREACHABLE(target);

 	}

 }

 

@@ -1134,7 +1131,7 @@
 

 			texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(target);

 	}

 }

 

@@ -1200,7 +1197,7 @@
 		{

 			texture = context->getTextureCubeMap();

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(target);

 

 		if(!validateSubImageParams(false, width, height, xoffset, yoffset, target, level, GL_NONE, texture))

 		{

@@ -2610,7 +2607,7 @@
 		{

 			attachmentObjectType = GL_TEXTURE;

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(attachmentType);

 

 		switch(pname)

 		{

@@ -4646,10 +4643,7 @@
 				texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);

 			}

 		}

-		else

-		{

-			UNREACHABLE();

-		}

+		else UNREACHABLE(target);

 	}

 }

 

@@ -5625,7 +5619,7 @@
 			case GL_UNSIGNED_INT: context->callList(((unsigned int*)lists)[i]); break;

 			default:

 				UNIMPLEMENTED();

-				UNREACHABLE();

+				UNREACHABLE(type);

 			}

 		}

 	}

@@ -7669,7 +7663,7 @@
 		break;

 	default:

 		UNIMPLEMENTED();

-		UNREACHABLE();

+		UNREACHABLE(texture);

 	}

 

 	gl::Context *context = gl::getContext();

diff --git a/src/OpenGL/libGL/main.cpp b/src/OpenGL/libGL/main.cpp
index 4a09aa5..0c7eabe 100644
--- a/src/OpenGL/libGL/main.cpp
+++ b/src/OpenGL/libGL/main.cpp
@@ -279,7 +279,7 @@
             context->recordInvalidFramebufferOperation();

             TRACE("\t! Error generated: invalid framebuffer operation\n");

             break;

-        default: UNREACHABLE();

+        default: UNREACHABLE(errorCode);

         }

     }

 }

diff --git a/src/OpenGL/libGL/utilities.cpp b/src/OpenGL/libGL/utilities.cpp
index b39d8ba..42ae5aa 100644
--- a/src/OpenGL/libGL/utilities.cpp
+++ b/src/OpenGL/libGL/utilities.cpp
@@ -50,7 +50,7 @@
 		case GL_FLOAT_MAT4:

 			return 16;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(type);

 		}

 

 		return 0;

@@ -81,7 +81,7 @@
 		case GL_INT_VEC4:

 			return GL_INT;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(type);

 		}

 

 		return GL_NONE;

@@ -127,7 +127,7 @@
 		case GL_FLOAT_MAT4:

 			return 4;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(type);

 		}

 

 		return 0;

@@ -159,7 +159,7 @@
 		case GL_FLOAT_MAT4:

 			return 4;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(type);

 		}

 

 		return 0;

@@ -247,7 +247,7 @@
 			case GL_RGB:             return sizeof(unsigned char) * 3;

 			case GL_RGBA:            return sizeof(unsigned char) * 4;

 			case GL_BGRA_EXT:        return sizeof(unsigned char) * 4;

-			default: UNREACHABLE();

+			default: UNREACHABLE(format);

 			}

 			break;

 		case GL_UNSIGNED_SHORT_4_4_4_4:

@@ -267,7 +267,7 @@
 			case GL_LUMINANCE_ALPHA: return sizeof(float) * 2;

 			case GL_RGB:             return sizeof(float) * 3;

 			case GL_RGBA:            return sizeof(float) * 4;

-			default: UNREACHABLE();

+			default: UNREACHABLE(format);

 			}

 			break;

 		case GL_HALF_FLOAT:

@@ -278,10 +278,10 @@
 			case GL_LUMINANCE_ALPHA: return sizeof(unsigned short) * 2;

 			case GL_RGB:             return sizeof(unsigned short) * 3;

 			case GL_RGBA:            return sizeof(unsigned short) * 4;

-			default: UNREACHABLE();

+			default: UNREACHABLE(format);

 			}

 			break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(type);

 		}

 

 		return 0;

@@ -303,7 +303,7 @@
 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: return 3;

 		case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: return 4;

 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: return 5;

-		default: UNREACHABLE(); return 0;

+		default: UNREACHABLE(cubeFace); return 0;

 		}

 	}

 

@@ -440,7 +440,7 @@
 		case GL_GREATER:  return sw::DEPTH_GREATER;

 		case GL_GEQUAL:   return sw::DEPTH_GREATEREQUAL;

 		case GL_NOTEQUAL: return sw::DEPTH_NOTEQUAL;

-		default: UNREACHABLE();

+		default: UNREACHABLE(comparison);

 		}

 

 		return sw::DEPTH_ALWAYS;

@@ -458,7 +458,7 @@
 		case GL_GREATER:  return sw::STENCIL_GREATER;

 		case GL_GEQUAL:   return sw::STENCIL_GREATEREQUAL;

 		case GL_NOTEQUAL: return sw::STENCIL_NOTEQUAL;

-		default: UNREACHABLE();

+		default: UNREACHABLE(comparison);

 		}

 

 		return sw::STENCIL_ALWAYS;

@@ -488,7 +488,7 @@
 		case GL_CONSTANT_ALPHA:           return sw::BLEND_CONSTANTALPHA;

 		case GL_ONE_MINUS_CONSTANT_ALPHA: return sw::BLEND_INVCONSTANTALPHA;

 		case GL_SRC_ALPHA_SATURATE:       return sw::BLEND_SRCALPHASAT;

-		default: UNREACHABLE();

+		default: UNREACHABLE(blend);

 		}

 

 		return sw::BLEND_ZERO;

@@ -503,7 +503,7 @@
 		case GL_FUNC_REVERSE_SUBTRACT: return sw::BLENDOP_INVSUB;

 		case GL_MIN_EXT:               return sw::BLENDOP_MIN;

 		case GL_MAX_EXT:               return sw::BLENDOP_MAX;

-		default: UNREACHABLE();

+		default: UNREACHABLE(blendOp);

 		}

 

 		return sw::BLENDOP_ADD;

@@ -521,7 +521,7 @@
 		case GL_INVERT:    return sw::OPERATION_INVERT;

 		case GL_INCR_WRAP: return sw::OPERATION_INCR;

 		case GL_DECR_WRAP: return sw::OPERATION_DECR;

-		default: UNREACHABLE();

+		default: UNREACHABLE(stencilOp);

 		}

 

 		return sw::OPERATION_KEEP;

@@ -535,7 +535,7 @@
 		case GL_REPEAT:            return sw::ADDRESSING_WRAP;

 		case GL_CLAMP_TO_EDGE:     return sw::ADDRESSING_CLAMP;

 		case GL_MIRRORED_REPEAT:   return sw::ADDRESSING_MIRROR;

-		default: UNREACHABLE();

+		default: UNREACHABLE(wrap);

 		}

 

 		return sw::ADDRESSING_WRAP;

@@ -551,7 +551,7 @@
 			return (frontFace == GL_CCW ? sw::CULL_COUNTERCLOCKWISE : sw::CULL_CLOCKWISE);

 		case GL_FRONT_AND_BACK:

 			return sw::CULL_NONE;   // culling will be handled during draw

-		default: UNREACHABLE();

+		default: UNREACHABLE(cullFace);

 		}

 

 		return sw::CULL_COUNTERCLOCKWISE;

@@ -571,7 +571,7 @@
 		{

 		case GL_NEAREST: return sw::FILTER_POINT;

 		case GL_LINEAR:  return sw::FILTER_LINEAR;

-		default: UNREACHABLE();

+		default: UNREACHABLE(magFilter);

 		}

 

 		return sw::FILTER_POINT;

@@ -608,7 +608,7 @@
 		default:

 			*minFilter = sw::FILTER_POINT;

 			*mipFilter = sw::MIPMAP_NONE;

-			UNREACHABLE();

+			UNREACHABLE(texFilter);

 		}

 

 		if(maxAnisotropy > 1.0f)

@@ -673,7 +673,7 @@
         case GL_DEPTH_COMPONENT24:

 		case GL_STENCIL_INDEX8:       

 		case GL_DEPTH24_STENCIL8_EXT: return sw::FORMAT_D24S8;

-		default: UNREACHABLE();       return sw::FORMAT_A8R8G8B8;

+		default: UNREACHABLE(format); return sw::FORMAT_A8R8G8B8;

 		}

 	}

 }

@@ -821,7 +821,7 @@
 		case sw::FORMAT_R5G6B5:   return GL_RGB565;

 		case sw::FORMAT_X8R8G8B8: return GL_RGB8_EXT;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(format);

 		}

 

 		return GL_RGBA4;

@@ -839,7 +839,7 @@
 		case sw::FORMAT_D24S8:

 			return GL_DEPTH24_STENCIL8_EXT;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(format);

 		}

 

 		return GL_DEPTH24_STENCIL8_EXT;

diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index 1ba9f8b..e0968b4 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -620,7 +620,7 @@
 		device->setPixelFogMode(sw::FOG_EXP2);

 		break;

 	default:

-		UNREACHABLE();

+		UNREACHABLE(mode);

 	}

 }

 

@@ -967,7 +967,7 @@
         {

         case TEXTURE_2D: return mTexture2DZero;

         case TEXTURE_EXTERNAL: return mTextureExternalZero;

-        default: UNREACHABLE();

+        default: UNREACHABLE(type);

         }

     }

 

@@ -1008,47 +1008,47 @@
     // because it is stored as a float, despite the fact that the GL ES 2.0 spec names

     // GetIntegerv as its native query function. As it would require conversion in any

     // case, this should make no difference to the calling application.

-    switch (pname)

+    switch(pname)

     {

-      case GL_LINE_WIDTH:               *params = mState.lineWidth;            break;

-      case GL_SAMPLE_COVERAGE_VALUE:    *params = mState.sampleCoverageValue;  break;

-      case GL_DEPTH_CLEAR_VALUE:        *params = mState.depthClearValue;      break;

-      case GL_POLYGON_OFFSET_FACTOR:    *params = mState.polygonOffsetFactor;  break;

-      case GL_POLYGON_OFFSET_UNITS:     *params = mState.polygonOffsetUnits;   break;

-      case GL_ALIASED_LINE_WIDTH_RANGE:

+    case GL_LINE_WIDTH:               *params = mState.lineWidth;            break;

+    case GL_SAMPLE_COVERAGE_VALUE:    *params = mState.sampleCoverageValue;  break;

+    case GL_DEPTH_CLEAR_VALUE:        *params = mState.depthClearValue;      break;

+    case GL_POLYGON_OFFSET_FACTOR:    *params = mState.polygonOffsetFactor;  break;

+    case GL_POLYGON_OFFSET_UNITS:     *params = mState.polygonOffsetUnits;   break;

+    case GL_ALIASED_LINE_WIDTH_RANGE:

         params[0] = ALIASED_LINE_WIDTH_RANGE_MIN;

         params[1] = ALIASED_LINE_WIDTH_RANGE_MAX;

         break;

-      case GL_ALIASED_POINT_SIZE_RANGE:

+    case GL_ALIASED_POINT_SIZE_RANGE:

         params[0] = ALIASED_POINT_SIZE_RANGE_MIN;

         params[1] = ALIASED_POINT_SIZE_RANGE_MAX;

         break;

-      case GL_DEPTH_RANGE:

+    case GL_DEPTH_RANGE:

         params[0] = mState.zNear;

         params[1] = mState.zFar;

         break;

-      case GL_COLOR_CLEAR_VALUE:

+    case GL_COLOR_CLEAR_VALUE:

         params[0] = mState.colorClearValue.red;

         params[1] = mState.colorClearValue.green;

         params[2] = mState.colorClearValue.blue;

         params[3] = mState.colorClearValue.alpha;

         break;

-	  case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:

+	case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:

         *params = MAX_TEXTURE_MAX_ANISOTROPY;

 		break;

-	  case GL_MODELVIEW_MATRIX:

+	case GL_MODELVIEW_MATRIX:

 		for(int i = 0; i < 16; i++)

 		{

 			params[i] = modelViewStack.current()[i % 4][i / 4];

 		}

 		break;

-	  case GL_PROJECTION_MATRIX:

+	case GL_PROJECTION_MATRIX:

 		for(int i = 0; i < 16; i++)

 		{

 			params[i] = projectionStack.current()[i % 4][i / 4];

 		}

 		break;

-      default:

+    default:

         return false;

     }

 

@@ -1357,7 +1357,7 @@
 	case GL_MAX_TEXTURE_UNITS:

         return 1;

 	default:

-		UNREACHABLE();

+		UNREACHABLE(pname);

     }

 

     return -1;

@@ -1712,7 +1712,7 @@
 

 	switch(mState.shadeModel)

 	{

-	default: UNREACHABLE();

+	default: UNREACHABLE(mState.shadeModel);

 	case GL_SMOOTH: device->setShadingMode(sw::SHADING_GOURAUD); break;

 	case GL_FLAT:   device->setShadingMode(sw::SHADING_FLAT);    break;

 	}

@@ -1885,7 +1885,7 @@
 						device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1);

 						device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG1);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(texFormat);

 					}

 					break;

 				case GL_MODULATE:

@@ -1909,7 +1909,7 @@
 						device->setStageOperation(unit, sw::TextureStage::STAGE_MODULATE);

 						device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(texFormat);

 					}

 					break;

 				case GL_DECAL:

@@ -1933,7 +1933,7 @@
 						device->setStageOperation(unit, sw::TextureStage::STAGE_BLENDTEXTUREALPHA);   // Alpha * (Arg1 - Arg2) + Arg2

 						device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(texFormat);

 					}

 					break;

 				case GL_BLEND:

@@ -1957,7 +1957,7 @@
 						device->setStageOperation(unit, sw::TextureStage::STAGE_LERP);   // Arg3 * (Arg1 - Arg2) + Arg2

 						device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(texFormat);

 					}

 					break;

 				case GL_ADD:

@@ -1981,11 +1981,11 @@
 						device->setStageOperation(unit, sw::TextureStage::STAGE_ADD);

 						device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(texFormat);

 					}

 					break;

 				default:

-					UNREACHABLE();

+					UNREACHABLE(mState.textureUnit[unit].environmentMode);

 				}

 			}

 			else   // GL_COMBINE

@@ -2271,7 +2271,7 @@
 					break;

 				default:

 					UNIMPLEMENTED();   // FIXME

-					UNREACHABLE();

+					UNREACHABLE(renderTarget->getInternalFormat());

 				}

 

 				switch(format)

@@ -2285,7 +2285,7 @@
 						dest[4 * i + 2] = (unsigned char)(255 * b + 0.5f);

 						dest[4 * i + 3] = (unsigned char)(255 * a + 0.5f);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type);

 					}

 					break;

 				case GL_BGRA_EXT:

@@ -2325,7 +2325,7 @@
 							((unsigned short)(31 * g + 0.5f) << 5) |

 							((unsigned short)(31 * b + 0.5f) << 0);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type);

 					}

 					break;

 				case GL_RGB:

@@ -2337,10 +2337,10 @@
 							((unsigned short)(63 * g + 0.5f) << 5) |

 							((unsigned short)(31 * r + 0.5f) << 11);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type);

 					}

 					break;

-				default: UNREACHABLE();

+				default: UNREACHABLE(format);

 				}

 			}

         }

@@ -2736,7 +2736,7 @@
       case GL_LINE_LOOP:

       case GL_LINE_STRIP:

         return false;

-      default: UNREACHABLE();

+      default: UNREACHABLE(drawMode);

     }

 

     return false;

@@ -2819,7 +2819,7 @@
             return EGL_BAD_ACCESS;

         }

     }

-    else UNREACHABLE();

+    else UNREACHABLE(target);

 

 	return EGL_SUCCESS;

 }

@@ -2838,7 +2838,7 @@
 

         return renderbuffer->createSharedImage();

     }

-    else UNREACHABLE();

+    else UNREACHABLE(target);

 

 	return 0;

 }

@@ -2870,7 +2870,7 @@
 		break;

 	}

 

-	UNREACHABLE();

+	UNREACHABLE(matrixMode);

 	return textureStack0;

 }

 

diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h
index d76a13a..63f091b 100644
--- a/src/OpenGL/libGLES_CM/Context.h
+++ b/src/OpenGL/libGLES_CM/Context.h
@@ -143,7 +143,7 @@
 

     int typeSize() const

     {

-        switch (mType)

+        switch(mType)

         {

         case GL_BYTE:           return mSize * sizeof(GLbyte);

         case GL_UNSIGNED_BYTE:  return mSize * sizeof(GLubyte);

@@ -151,7 +151,7 @@
         case GL_UNSIGNED_SHORT: return mSize * sizeof(GLushort);

         case GL_FIXED:          return mSize * sizeof(GLfixed);

         case GL_FLOAT:          return mSize * sizeof(GLfloat);

-        default: UNREACHABLE(); return mSize * sizeof(GLfloat);

+        default: UNREACHABLE(mType); return mSize * sizeof(GLfloat);

         }

     }

 

diff --git a/src/OpenGL/libGLES_CM/Device.cpp b/src/OpenGL/libGLES_CM/Device.cpp
index 8bb508c..bc2121f 100644
--- a/src/OpenGL/libGLES_CM/Device.cpp
+++ b/src/OpenGL/libGLES_CM/Device.cpp
@@ -237,7 +237,7 @@
 			lockable = true;

 			break;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(format);

 		}

 

 		egl::Image *surface = new egl::Image(width, height, format, multiSampleDepth, lockable, true);

@@ -290,7 +290,7 @@
 			case DRAW_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST32;  break;

 			case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP32; break;

 			case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN32;	  break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(type);

 			}

 		}

 		else if(indexSize == 2)

@@ -304,7 +304,7 @@
 			case DRAW_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST16;  break;

 			case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP16; break;

 			case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN16;   break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(type);

 			}

 		}

 		else if(indexSize == 1)

@@ -318,10 +318,10 @@
 			case DRAW_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST8;  break;

 			case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP8; break;

 			case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN8;   break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(type);

 			}

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(indexSize);

 

 		draw(drawType, indexOffset, primitiveCount);

 	}

@@ -346,7 +346,7 @@
 		case DRAW_TRIANGLELIST:  drawType = sw::DRAW_TRIANGLELIST;  break;

 		case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_TRIANGLESTRIP; break;

 		case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_TRIANGLEFAN;   break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(primitiveType);

 		}

 

 		draw(drawType, 0, primitiveCount);

diff --git a/src/OpenGL/libGLES_CM/Framebuffer.cpp b/src/OpenGL/libGLES_CM/Framebuffer.cpp
index 04dd9ad..3eb9eff 100644
--- a/src/OpenGL/libGLES_CM/Framebuffer.cpp
+++ b/src/OpenGL/libGLES_CM/Framebuffer.cpp
@@ -53,10 +53,7 @@
 	{
 		buffer = context->getTexture(handle)->getRenderbuffer(type);
 	}
-	else
-	{
-		UNREACHABLE();
-	}
+	else UNREACHABLE(type);
 
 	return buffer;
 }
@@ -269,7 +266,7 @@
 		}
 		else
 		{
-			UNREACHABLE();
+			UNREACHABLE(mColorbufferType);
 			return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES;
 		}
 
@@ -311,7 +308,7 @@
 		}
 		else
 		{
-			UNREACHABLE();
+			UNREACHABLE(mDepthbufferType);
 			return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES;
 		}
 
@@ -327,7 +324,7 @@
 		}
 		else if(samples != depthbuffer->getSamples())
 		{
-			UNREACHABLE();
+			UNREACHABLE(0);
 		}
 	}
 
@@ -363,7 +360,7 @@
 		}
 		else
 		{
-			UNREACHABLE();
+			UNREACHABLE(mStencilbufferType);
 			return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES;
 		}
 
@@ -379,7 +376,7 @@
 		}
 		else if(samples != stencilbuffer->getSamples())
 		{
-			UNREACHABLE();
+			UNREACHABLE(0);
 			return GL_FRAMEBUFFER_UNSUPPORTED_OES;   // GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_OES;
 		}
 	}
@@ -416,7 +413,7 @@
 		case sw::FORMAT_A1R5G5B5:      return GL_BGRA_EXT;
 		case sw::FORMAT_R5G6B5:        return 0x80E0;   // GL_BGR_EXT
 		default:
-			UNREACHABLE();
+			UNREACHABLE(colorbuffer->getInternalFormat());
 		}
 	}
 
@@ -438,7 +435,7 @@
 		case sw::FORMAT_A1R5G5B5:      return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
 		case sw::FORMAT_R5G6B5:        return GL_UNSIGNED_SHORT_5_6_5;
 		default:
-			UNREACHABLE();
+			UNREACHABLE(colorbuffer->getInternalFormat());
 		}
 	}
 
diff --git a/src/OpenGL/libGLES_CM/IndexDataManager.cpp b/src/OpenGL/libGLES_CM/IndexDataManager.cpp
index 25426dc..0de5ebf 100644
--- a/src/OpenGL/libGLES_CM/IndexDataManager.cpp
+++ b/src/OpenGL/libGLES_CM/IndexDataManager.cpp
@@ -53,7 +53,7 @@
     {

         memcpy(output, input, count * sizeof(GLushort));

     }

-    else UNREACHABLE();

+    else UNREACHABLE(type);

 }

 

 template<class IndexType>

@@ -79,7 +79,7 @@
     {

         computeRange(static_cast<const GLushort*>(indices), count, minIndex, maxIndex);

     }

-    else UNREACHABLE();

+    else UNREACHABLE(type);

 }

 

 GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, Buffer *buffer, const void *indices, TranslatedIndexData *translated)

@@ -96,9 +96,9 @@
     {

         switch(type)

         {

-          case GL_UNSIGNED_BYTE:  alignedOffset = (offset % sizeof(GLubyte) == 0);  break;

-          case GL_UNSIGNED_SHORT: alignedOffset = (offset % sizeof(GLushort) == 0); break;

-          default: UNREACHABLE(); alignedOffset = false;

+        case GL_UNSIGNED_BYTE:  alignedOffset = (offset % sizeof(GLubyte) == 0);  break;

+        case GL_UNSIGNED_SHORT: alignedOffset = (offset % sizeof(GLushort) == 0); break;

+        default: UNREACHABLE(type); alignedOffset = false;

         }

 

         if(typeSize(type) * count + offset > static_cast<std::size_t>(buffer->size()))

@@ -152,7 +152,7 @@
     {

     case GL_UNSIGNED_SHORT: return sizeof(GLushort);

     case GL_UNSIGNED_BYTE:  return sizeof(GLubyte);

-    default: UNREACHABLE(); return sizeof(GLushort);

+    default: UNREACHABLE(type); return sizeof(GLushort);

     }

 }

 

diff --git a/src/OpenGL/libGLES_CM/ResourceManager.cpp b/src/OpenGL/libGLES_CM/ResourceManager.cpp
index 4e9f1bd..89c12be 100644
--- a/src/OpenGL/libGLES_CM/ResourceManager.cpp
+++ b/src/OpenGL/libGLES_CM/ResourceManager.cpp
@@ -203,7 +203,7 @@
         }
         else
         {
-            UNREACHABLE();
+            UNREACHABLE(type);
             return;
         }
 
diff --git a/src/OpenGL/libGLES_CM/Texture.cpp b/src/OpenGL/libGLES_CM/Texture.cpp
index b81f455..818c1b8 100644
--- a/src/OpenGL/libGLES_CM/Texture.cpp
+++ b/src/OpenGL/libGLES_CM/Texture.cpp
@@ -323,7 +323,7 @@
     case GL_NEAREST_MIPMAP_LINEAR:

     case GL_LINEAR_MIPMAP_LINEAR:

         return true;

-    default: UNREACHABLE();

+    default: UNREACHABLE(mMinFilter);

     }

 

 	return false;

@@ -822,7 +822,7 @@
 		lockable = true;

 		break;

 	default:

-		UNREACHABLE();

+		UNREACHABLE(format);

 	}

 

 	egl::Image *surface = new egl::Image(width, height, format, multiSampleDepth, lockable, true);

diff --git a/src/OpenGL/libGLES_CM/VertexDataManager.cpp b/src/OpenGL/libGLES_CM/VertexDataManager.cpp
index 878a893..44224fe 100644
--- a/src/OpenGL/libGLES_CM/VertexDataManager.cpp
+++ b/src/OpenGL/libGLES_CM/VertexDataManager.cpp
@@ -176,7 +176,7 @@
 			case GL_UNSIGNED_SHORT: translated[i].type = sw::STREAMTYPE_USHORT; break;

 			case GL_FIXED:          translated[i].type = sw::STREAMTYPE_FIXED;  break;

 			case GL_FLOAT:          translated[i].type = sw::STREAMTYPE_FLOAT;  break;

-			default: UNREACHABLE(); translated[i].type = sw::STREAMTYPE_FLOAT;  break;

+			default: UNREACHABLE(attribs[i].mType); translated[i].type = sw::STREAMTYPE_FLOAT;  break;

 			}

 

 			translated[i].count = attribs[i].mSize;

diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cpp b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
index 175f939..b5fcdd6 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
@@ -722,7 +722,7 @@
 

 			texture->setCompressedImage(level, internalformat, width, height, imageSize, data);

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(target);

 	}

 }

 

@@ -793,7 +793,7 @@
 				texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);

 			}

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(target);

 	}

 }

 

@@ -908,7 +908,7 @@
 

 			texture->copyImage(level, internalformat, x, y, width, height, framebuffer);

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(target);

 	}

 }

 

@@ -967,7 +967,7 @@
 		{

 			texture = context->getTexture2D();

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(target);

 

 		if(!validateSubImageParams(false, width, height, xoffset, yoffset, target, level, GL_NONE_OES, texture))

 		{

@@ -1998,7 +1998,7 @@
 		{

 			attachmentObjectType = GL_TEXTURE;

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(attachmentType);

 

 		switch(pname)

 		{

@@ -3284,7 +3284,7 @@
 

 			texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(target);

 	}

 }

 

@@ -3518,7 +3518,7 @@
 				texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);

 			}

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(target);

 	}

 }

 

@@ -3591,7 +3591,7 @@
 		{

 		case GL_TEXTURE_2D:           texture = context->getTexture2D();       break;

 		case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break;

-		default:                      UNREACHABLE();

+		default:                      UNREACHABLE(target);

 		}

 

 		if(!texture)

diff --git a/src/OpenGL/libGLES_CM/main.cpp b/src/OpenGL/libGLES_CM/main.cpp
index f3de48a..381cee1 100644
--- a/src/OpenGL/libGLES_CM/main.cpp
+++ b/src/OpenGL/libGLES_CM/main.cpp
@@ -135,7 +135,7 @@
             context->recordInvalidFramebufferOperation();

             TRACE("\t! Error generated: invalid framebuffer operation\n");

             break;

-        default: UNREACHABLE();

+        default: UNREACHABLE(errorCode);

         }

     }

 }

diff --git a/src/OpenGL/libGLES_CM/utilities.cpp b/src/OpenGL/libGLES_CM/utilities.cpp
index 0fb1e98..dc6be54 100644
--- a/src/OpenGL/libGLES_CM/utilities.cpp
+++ b/src/OpenGL/libGLES_CM/utilities.cpp
@@ -55,7 +55,7 @@
 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES: return 3;

 		case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES: return 4;

 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES: return 5;

-		default: UNREACHABLE(); return 0;

+		default: UNREACHABLE(cubeFace); return 0;

 		}

 	}

 

@@ -173,7 +173,7 @@
 		case GL_GREATER:  return sw::DEPTH_GREATER;

 		case GL_GEQUAL:   return sw::DEPTH_GREATEREQUAL;

 		case GL_NOTEQUAL: return sw::DEPTH_NOTEQUAL;

-		default: UNREACHABLE();

+		default: UNREACHABLE(comparison);

 		}

 

 		return sw::DEPTH_ALWAYS;

@@ -191,7 +191,7 @@
 		case GL_GREATER:  return sw::STENCIL_GREATER;

 		case GL_GEQUAL:   return sw::STENCIL_GREATEREQUAL;

 		case GL_NOTEQUAL: return sw::STENCIL_NOTEQUAL;

-		default: UNREACHABLE();

+		default: UNREACHABLE(comparison);

 		}

 

 		return sw::STENCIL_ALWAYS;

@@ -217,7 +217,7 @@
 		case GL_DST_ALPHA:                return sw::BLEND_DESTALPHA;

 		case GL_ONE_MINUS_DST_ALPHA:      return sw::BLEND_INVDESTALPHA;

 		case GL_SRC_ALPHA_SATURATE:       return sw::BLEND_SRCALPHASAT;

-		default: UNREACHABLE();

+		default: UNREACHABLE(blend);

 		}

 

 		return sw::BLEND_ZERO;

@@ -232,7 +232,7 @@
 		case GL_FUNC_REVERSE_SUBTRACT_OES: return sw::BLENDOP_INVSUB;

 		case GL_MIN_EXT:                   return sw::BLENDOP_MIN;

 		case GL_MAX_EXT:                   return sw::BLENDOP_MAX;

-		default: UNREACHABLE();

+		default: UNREACHABLE(blendOp);

 		}

 

 		return sw::BLENDOP_ADD;

@@ -250,7 +250,7 @@
 		case GL_INVERT:        return sw::OPERATION_INVERT;

 		case GL_INCR_WRAP_OES: return sw::OPERATION_INCR;

 		case GL_DECR_WRAP_OES: return sw::OPERATION_DECR;

-		default: UNREACHABLE();

+		default: UNREACHABLE(stencilOp);

 		}

 

 		return sw::OPERATION_KEEP;

@@ -263,7 +263,7 @@
 		case GL_REPEAT:              return sw::ADDRESSING_WRAP;

 		case GL_CLAMP_TO_EDGE:       return sw::ADDRESSING_CLAMP;

 		case GL_MIRRORED_REPEAT_OES: return sw::ADDRESSING_MIRROR;

-		default: UNREACHABLE();

+		default: UNREACHABLE(wrap);

 		}

 

 		return sw::ADDRESSING_WRAP;

@@ -279,7 +279,7 @@
 			return (frontFace == GL_CCW ? sw::CULL_COUNTERCLOCKWISE : sw::CULL_CLOCKWISE);

 		case GL_FRONT_AND_BACK:

 			return sw::CULL_NONE;   // culling will be handled during draw

-		default: UNREACHABLE();

+		default: UNREACHABLE(cullFace);

 		}

 

 		return sw::CULL_COUNTERCLOCKWISE;

@@ -299,7 +299,7 @@
 		{

 		case GL_NEAREST: return sw::FILTER_POINT;

 		case GL_LINEAR:  return sw::FILTER_LINEAR;

-		default: UNREACHABLE();

+		default: UNREACHABLE(magFilter);

 		}

 

 		return sw::FILTER_POINT;

@@ -336,7 +336,7 @@
 		default:

 			*minFilter = sw::FILTER_POINT;

 			*mipFilter = sw::MIPMAP_NONE;

-			UNREACHABLE();

+			UNREACHABLE(texFilter);

 		}

 

 		if(maxAnisotropy > 1.0f)

@@ -396,7 +396,7 @@
 		case GL_DEPTH_COMPONENT16_OES:

 		case GL_STENCIL_INDEX8_OES:

 		case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8;

-		default: UNREACHABLE();       return sw::FORMAT_A8B8G8R8;

+		default: UNREACHABLE(format); return sw::FORMAT_A8B8G8R8;

 		}

 	}

 

@@ -412,7 +412,7 @@
 		case GL_SUBTRACT:       return sw::TextureStage::STAGE_SUBTRACT;

 		case GL_DOT3_RGB:       return sw::TextureStage::STAGE_DOT3;

 		case GL_DOT3_RGBA:      return sw::TextureStage::STAGE_DOT3;

-		default: UNREACHABLE(); return sw::TextureStage::STAGE_SELECTARG1;

+		default: UNREACHABLE(operation); return sw::TextureStage::STAGE_SELECTARG1;

 		}

 	}

 

@@ -424,7 +424,7 @@
 		case GL_CONSTANT:       return sw::TextureStage::SOURCE_CONSTANT;

 		case GL_PRIMARY_COLOR:  return sw::TextureStage::SOURCE_DIFFUSE;

 		case GL_PREVIOUS:       return sw::TextureStage::SOURCE_CURRENT;

-		default: UNREACHABLE(); return sw::TextureStage::SOURCE_CURRENT;

+		default: UNREACHABLE(argument); return sw::TextureStage::SOURCE_CURRENT;

 		}

 	}

 

@@ -436,7 +436,7 @@
 		case GL_ONE_MINUS_SRC_COLOR: return sw::TextureStage::MODIFIER_INVCOLOR;

 		case GL_SRC_ALPHA:           return sw::TextureStage::MODIFIER_ALPHA;

 		case GL_ONE_MINUS_SRC_ALPHA: return sw::TextureStage::MODIFIER_INVALPHA;

-		default: UNREACHABLE();      return sw::TextureStage::MODIFIER_COLOR;

+		default: UNREACHABLE(operand);      return sw::TextureStage::MODIFIER_COLOR;

 		}

 	}

 }

@@ -594,7 +594,7 @@
 		case sw::FORMAT_X8R8G8B8: return GL_RGB8_OES;

 		case sw::FORMAT_X8B8G8R8: return GL_RGB8_OES;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(format);

 		}

 

 		return GL_RGBA4_OES;

@@ -611,7 +611,7 @@
 		case sw::FORMAT_D24S8:

 			return GL_DEPTH24_STENCIL8_OES;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(format);

 		}

 

 		return GL_DEPTH24_STENCIL8_OES;

diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 121e956..5ad77f2 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1712,7 +1712,7 @@
 		case TEXTURE_2D_ARRAY: return mTexture2DArrayZero;

         case TEXTURE_CUBE: return mTextureCubeMapZero;

         case TEXTURE_EXTERNAL: return mTextureExternalZero;

-        default: UNREACHABLE();

+        default: UNREACHABLE(type);

         }

     }

 

@@ -1721,49 +1721,49 @@
 

 bool Context::getBooleanv(GLenum pname, GLboolean *params) const

 {

-    switch (pname)

+    switch(pname)

     {

-      case GL_SHADER_COMPILER:          *params = GL_TRUE;                          break;

-      case GL_SAMPLE_COVERAGE_INVERT:   *params = mState.sampleCoverageInvert;      break;

-      case GL_DEPTH_WRITEMASK:          *params = mState.depthMask;                 break;

-      case GL_COLOR_WRITEMASK:

+    case GL_SHADER_COMPILER:          *params = GL_TRUE;                          break;

+    case GL_SAMPLE_COVERAGE_INVERT:   *params = mState.sampleCoverageInvert;      break;

+    case GL_DEPTH_WRITEMASK:          *params = mState.depthMask;                 break;

+    case GL_COLOR_WRITEMASK:

         params[0] = mState.colorMaskRed;

         params[1] = mState.colorMaskGreen;

         params[2] = mState.colorMaskBlue;

         params[3] = mState.colorMaskAlpha;

         break;

-      case GL_CULL_FACE:                *params = mState.cullFace;                  break;

-      case GL_POLYGON_OFFSET_FILL:      *params = mState.polygonOffsetFill;         break;

-      case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mState.sampleAlphaToCoverage;     break;

-      case GL_SAMPLE_COVERAGE:          *params = mState.sampleCoverage;            break;

-      case GL_SCISSOR_TEST:             *params = mState.scissorTest;               break;

-      case GL_STENCIL_TEST:             *params = mState.stencilTest;               break;

-      case GL_DEPTH_TEST:               *params = mState.depthTest;                 break;

-      case GL_BLEND:                    *params = mState.blend;                     break;

-      case GL_DITHER:                   *params = mState.dither;                    break;

-      case GL_PRIMITIVE_RESTART_FIXED_INDEX: *params = mState.primitiveRestartFixedIndex; break;

-      case GL_RASTERIZER_DISCARD:       *params = mState.rasterizerDiscard;         break;

-	  case GL_TRANSFORM_FEEDBACK_ACTIVE:

-	  {

-		  TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);

-		  if(transformFeedback)

-		  {

-			  *params = transformFeedback->isActive();

-			  break;

-		  }

-		  else return false;

-	  }

-      case GL_TRANSFORM_FEEDBACK_PAUSED:

-	  {

-		  TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);

-		  if(transformFeedback)

-		  {

-			  *params = transformFeedback->isPaused();

-			  break;

-		  }

-		  else return false;

-	  }

-      default:

+    case GL_CULL_FACE:                *params = mState.cullFace;                  break;

+    case GL_POLYGON_OFFSET_FILL:      *params = mState.polygonOffsetFill;         break;

+    case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mState.sampleAlphaToCoverage;     break;

+    case GL_SAMPLE_COVERAGE:          *params = mState.sampleCoverage;            break;

+    case GL_SCISSOR_TEST:             *params = mState.scissorTest;               break;

+    case GL_STENCIL_TEST:             *params = mState.stencilTest;               break;

+    case GL_DEPTH_TEST:               *params = mState.depthTest;                 break;

+    case GL_BLEND:                    *params = mState.blend;                     break;

+    case GL_DITHER:                   *params = mState.dither;                    break;

+    case GL_PRIMITIVE_RESTART_FIXED_INDEX: *params = mState.primitiveRestartFixedIndex; break;

+    case GL_RASTERIZER_DISCARD:       *params = mState.rasterizerDiscard;         break;

+	case GL_TRANSFORM_FEEDBACK_ACTIVE:

+		{

+			TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);

+			if(transformFeedback)

+			{

+				*params = transformFeedback->isActive();

+				break;

+			}

+			else return false;

+		}

+     case GL_TRANSFORM_FEEDBACK_PAUSED:

+		{

+			TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);

+			if(transformFeedback)

+			{

+				*params = transformFeedback->isPaused();

+				break;

+			}

+			else return false;

+		}

+    default:

         return false;

     }

 

@@ -1776,41 +1776,41 @@
     // because it is stored as a float, despite the fact that the GL ES 2.0 spec names

     // GetIntegerv as its native query function. As it would require conversion in any

     // case, this should make no difference to the calling application.

-    switch (pname)

+    switch(pname)

     {

-      case GL_LINE_WIDTH:               *params = mState.lineWidth;            break;

-      case GL_SAMPLE_COVERAGE_VALUE:    *params = mState.sampleCoverageValue;  break;

-      case GL_DEPTH_CLEAR_VALUE:        *params = mState.depthClearValue;      break;

-      case GL_POLYGON_OFFSET_FACTOR:    *params = mState.polygonOffsetFactor;  break;

-      case GL_POLYGON_OFFSET_UNITS:     *params = mState.polygonOffsetUnits;   break;

-      case GL_ALIASED_LINE_WIDTH_RANGE:

+    case GL_LINE_WIDTH:               *params = mState.lineWidth;            break;

+    case GL_SAMPLE_COVERAGE_VALUE:    *params = mState.sampleCoverageValue;  break;

+    case GL_DEPTH_CLEAR_VALUE:        *params = mState.depthClearValue;      break;

+    case GL_POLYGON_OFFSET_FACTOR:    *params = mState.polygonOffsetFactor;  break;

+    case GL_POLYGON_OFFSET_UNITS:     *params = mState.polygonOffsetUnits;   break;

+    case GL_ALIASED_LINE_WIDTH_RANGE:

         params[0] = ALIASED_LINE_WIDTH_RANGE_MIN;

         params[1] = ALIASED_LINE_WIDTH_RANGE_MAX;

         break;

-      case GL_ALIASED_POINT_SIZE_RANGE:

+    case GL_ALIASED_POINT_SIZE_RANGE:

         params[0] = ALIASED_POINT_SIZE_RANGE_MIN;

         params[1] = ALIASED_POINT_SIZE_RANGE_MAX;

         break;

-      case GL_DEPTH_RANGE:

+    case GL_DEPTH_RANGE:

         params[0] = mState.zNear;

         params[1] = mState.zFar;

         break;

-      case GL_COLOR_CLEAR_VALUE:

+    case GL_COLOR_CLEAR_VALUE:

         params[0] = mState.colorClearValue.red;

         params[1] = mState.colorClearValue.green;

         params[2] = mState.colorClearValue.blue;

         params[3] = mState.colorClearValue.alpha;

         break;

-      case GL_BLEND_COLOR:

+    case GL_BLEND_COLOR:

         params[0] = mState.blendColor.red;

         params[1] = mState.blendColor.green;

         params[2] = mState.blendColor.blue;

         params[3] = mState.blendColor.alpha;

         break;

-	  case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:

+	case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:

         *params = MAX_TEXTURE_MAX_ANISOTROPY;

 		break;

-      default:

+    default:

         return false;

     }

 

@@ -1827,7 +1827,7 @@
     // GetIntegerv as its native query function. As it would require conversion in any

     // case, this should make no difference to the calling application. You may find it in 

     // Context::getFloatv.

-    switch (pname)

+    switch(pname)

     {

     case GL_MAX_VERTEX_ATTRIBS:               *params = MAX_VERTEX_ATTRIBS;               break;

     case GL_MAX_VERTEX_UNIFORM_VECTORS:       *params = MAX_VERTEX_UNIFORM_VECTORS;       break;

@@ -2359,227 +2359,227 @@
     // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we

     // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling

     // application.

-    switch (pname)

+    switch(pname)

     {

-      case GL_COMPRESSED_TEXTURE_FORMATS:

+    case GL_COMPRESSED_TEXTURE_FORMATS:

 		{

             *type = GL_INT;

 			*numParams = NUM_COMPRESSED_TEXTURE_FORMATS;

         }

 		break;

-      case GL_SHADER_BINARY_FORMATS:

+    case GL_SHADER_BINARY_FORMATS:

         {

             *type = GL_INT;

             *numParams = 0;

         }

         break;

-      case GL_MAX_VERTEX_ATTRIBS:

-      case GL_MAX_VERTEX_UNIFORM_VECTORS:

-      case GL_MAX_VARYING_VECTORS:

-      case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:

-      case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:

-      case GL_MAX_TEXTURE_IMAGE_UNITS:

-      case GL_MAX_FRAGMENT_UNIFORM_VECTORS:

-      case GL_MAX_RENDERBUFFER_SIZE:

-      case GL_NUM_SHADER_BINARY_FORMATS:

-      case GL_NUM_COMPRESSED_TEXTURE_FORMATS:

-      case GL_ARRAY_BUFFER_BINDING:

-      case GL_FRAMEBUFFER_BINDING:

-      case GL_RENDERBUFFER_BINDING:

-      case GL_CURRENT_PROGRAM:

-      case GL_PACK_ALIGNMENT:

-      case GL_UNPACK_ALIGNMENT:

-      case GL_GENERATE_MIPMAP_HINT:

-      case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:

-      case GL_RED_BITS:

-      case GL_GREEN_BITS:

-      case GL_BLUE_BITS:

-      case GL_ALPHA_BITS:

-      case GL_DEPTH_BITS:

-      case GL_STENCIL_BITS:

-      case GL_ELEMENT_ARRAY_BUFFER_BINDING:

-      case GL_CULL_FACE_MODE:

-      case GL_FRONT_FACE:

-      case GL_ACTIVE_TEXTURE:

-      case GL_STENCIL_FUNC:

-      case GL_STENCIL_VALUE_MASK:

-      case GL_STENCIL_REF:

-      case GL_STENCIL_FAIL:

-      case GL_STENCIL_PASS_DEPTH_FAIL:

-      case GL_STENCIL_PASS_DEPTH_PASS:

-      case GL_STENCIL_BACK_FUNC:

-      case GL_STENCIL_BACK_VALUE_MASK:

-      case GL_STENCIL_BACK_REF:

-      case GL_STENCIL_BACK_FAIL:

-      case GL_STENCIL_BACK_PASS_DEPTH_FAIL:

-      case GL_STENCIL_BACK_PASS_DEPTH_PASS:

-      case GL_DEPTH_FUNC:

-      case GL_BLEND_SRC_RGB:

-      case GL_BLEND_SRC_ALPHA:

-      case GL_BLEND_DST_RGB:

-      case GL_BLEND_DST_ALPHA:

-      case GL_BLEND_EQUATION_RGB:

-      case GL_BLEND_EQUATION_ALPHA:

-      case GL_STENCIL_WRITEMASK:

-      case GL_STENCIL_BACK_WRITEMASK:

-      case GL_STENCIL_CLEAR_VALUE:

-      case GL_SUBPIXEL_BITS:

-      case GL_MAX_TEXTURE_SIZE:

-      case GL_MAX_CUBE_MAP_TEXTURE_SIZE:

-      case GL_SAMPLE_BUFFERS:

-      case GL_SAMPLES:

-      case GL_IMPLEMENTATION_COLOR_READ_TYPE:

-      case GL_IMPLEMENTATION_COLOR_READ_FORMAT:

-      case GL_TEXTURE_BINDING_2D:

-      case GL_TEXTURE_BINDING_CUBE_MAP:

-      case GL_TEXTURE_BINDING_EXTERNAL_OES:

-      case GL_TEXTURE_BINDING_3D_OES:

-      case GL_COPY_READ_BUFFER_BINDING:

-      case GL_COPY_WRITE_BUFFER_BINDING:

-      case GL_DRAW_BUFFER0:

-      case GL_DRAW_BUFFER1:

-      case GL_DRAW_BUFFER2:

-      case GL_DRAW_BUFFER3:

-      case GL_DRAW_BUFFER4:

-      case GL_DRAW_BUFFER5:

-      case GL_DRAW_BUFFER6:

-      case GL_DRAW_BUFFER7:

-      case GL_DRAW_BUFFER8:

-      case GL_DRAW_BUFFER9:

-      case GL_DRAW_BUFFER10:

-      case GL_DRAW_BUFFER11:

-      case GL_DRAW_BUFFER12:

-      case GL_DRAW_BUFFER13:

-      case GL_DRAW_BUFFER14:

-      case GL_DRAW_BUFFER15:

-      case GL_MAJOR_VERSION:

-      case GL_MAX_3D_TEXTURE_SIZE:

-      case GL_MAX_ARRAY_TEXTURE_LAYERS:

-      case GL_MAX_COLOR_ATTACHMENTS:

-      case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:

-      case GL_MAX_COMBINED_UNIFORM_BLOCKS:

-      case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:

-      case GL_MAX_DRAW_BUFFERS:

-      case GL_MAX_ELEMENT_INDEX:

-      case GL_MAX_ELEMENTS_INDICES:

-      case GL_MAX_ELEMENTS_VERTICES:

-      case GL_MAX_FRAGMENT_INPUT_COMPONENTS:

-      case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:

-      case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:

-      case GL_MAX_PROGRAM_TEXEL_OFFSET:

-      case GL_MAX_SERVER_WAIT_TIMEOUT:

-      case GL_MAX_TEXTURE_LOD_BIAS:

-      case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:

-      case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:

-      case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:

-      case GL_MAX_UNIFORM_BLOCK_SIZE:

-      case GL_MAX_UNIFORM_BUFFER_BINDINGS:

-      case GL_MAX_VARYING_COMPONENTS:

-      case GL_MAX_VERTEX_OUTPUT_COMPONENTS:

-      case GL_MAX_VERTEX_UNIFORM_BLOCKS:

-      case GL_MAX_VERTEX_UNIFORM_COMPONENTS:

-      case GL_MIN_PROGRAM_TEXEL_OFFSET:

-      case GL_MINOR_VERSION:

-      case GL_NUM_EXTENSIONS:

-      case GL_NUM_PROGRAM_BINARY_FORMATS:

-      case GL_PACK_ROW_LENGTH:

-      case GL_PACK_SKIP_PIXELS:

-      case GL_PACK_SKIP_ROWS:

-      case GL_PIXEL_PACK_BUFFER_BINDING:

-      case GL_PIXEL_UNPACK_BUFFER_BINDING:

-      case GL_PROGRAM_BINARY_FORMATS:

-      case GL_READ_BUFFER:

-      case GL_SAMPLER_BINDING:

-      case GL_TEXTURE_BINDING_2D_ARRAY:

-      case GL_UNIFORM_BUFFER_BINDING:

-      case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:

-      case GL_UNIFORM_BUFFER_SIZE:

-      case GL_UNIFORM_BUFFER_START:

-      case GL_UNPACK_IMAGE_HEIGHT:

-      case GL_UNPACK_ROW_LENGTH:

-      case GL_UNPACK_SKIP_IMAGES:

-      case GL_UNPACK_SKIP_PIXELS:

-      case GL_UNPACK_SKIP_ROWS:

-      case GL_VERTEX_ARRAY_BINDING:

+    case GL_MAX_VERTEX_ATTRIBS:

+    case GL_MAX_VERTEX_UNIFORM_VECTORS:

+    case GL_MAX_VARYING_VECTORS:

+    case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:

+    case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:

+    case GL_MAX_TEXTURE_IMAGE_UNITS:

+    case GL_MAX_FRAGMENT_UNIFORM_VECTORS:

+    case GL_MAX_RENDERBUFFER_SIZE:

+    case GL_NUM_SHADER_BINARY_FORMATS:

+    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:

+    case GL_ARRAY_BUFFER_BINDING:

+    case GL_FRAMEBUFFER_BINDING:

+    case GL_RENDERBUFFER_BINDING:

+    case GL_CURRENT_PROGRAM:

+    case GL_PACK_ALIGNMENT:

+    case GL_UNPACK_ALIGNMENT:

+    case GL_GENERATE_MIPMAP_HINT:

+    case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:

+    case GL_RED_BITS:

+    case GL_GREEN_BITS:

+    case GL_BLUE_BITS:

+    case GL_ALPHA_BITS:

+    case GL_DEPTH_BITS:

+    case GL_STENCIL_BITS:

+    case GL_ELEMENT_ARRAY_BUFFER_BINDING:

+    case GL_CULL_FACE_MODE:

+    case GL_FRONT_FACE:

+    case GL_ACTIVE_TEXTURE:

+    case GL_STENCIL_FUNC:

+    case GL_STENCIL_VALUE_MASK:

+    case GL_STENCIL_REF:

+    case GL_STENCIL_FAIL:

+    case GL_STENCIL_PASS_DEPTH_FAIL:

+    case GL_STENCIL_PASS_DEPTH_PASS:

+    case GL_STENCIL_BACK_FUNC:

+    case GL_STENCIL_BACK_VALUE_MASK:

+    case GL_STENCIL_BACK_REF:

+    case GL_STENCIL_BACK_FAIL:

+    case GL_STENCIL_BACK_PASS_DEPTH_FAIL:

+    case GL_STENCIL_BACK_PASS_DEPTH_PASS:

+    case GL_DEPTH_FUNC:

+    case GL_BLEND_SRC_RGB:

+    case GL_BLEND_SRC_ALPHA:

+    case GL_BLEND_DST_RGB:

+    case GL_BLEND_DST_ALPHA:

+    case GL_BLEND_EQUATION_RGB:

+    case GL_BLEND_EQUATION_ALPHA:

+    case GL_STENCIL_WRITEMASK:

+    case GL_STENCIL_BACK_WRITEMASK:

+    case GL_STENCIL_CLEAR_VALUE:

+    case GL_SUBPIXEL_BITS:

+    case GL_MAX_TEXTURE_SIZE:

+    case GL_MAX_CUBE_MAP_TEXTURE_SIZE:

+    case GL_SAMPLE_BUFFERS:

+    case GL_SAMPLES:

+    case GL_IMPLEMENTATION_COLOR_READ_TYPE:

+    case GL_IMPLEMENTATION_COLOR_READ_FORMAT:

+    case GL_TEXTURE_BINDING_2D:

+    case GL_TEXTURE_BINDING_CUBE_MAP:

+    case GL_TEXTURE_BINDING_EXTERNAL_OES:

+    case GL_TEXTURE_BINDING_3D_OES:

+    case GL_COPY_READ_BUFFER_BINDING:

+    case GL_COPY_WRITE_BUFFER_BINDING:

+    case GL_DRAW_BUFFER0:

+    case GL_DRAW_BUFFER1:

+    case GL_DRAW_BUFFER2:

+    case GL_DRAW_BUFFER3:

+    case GL_DRAW_BUFFER4:

+    case GL_DRAW_BUFFER5:

+    case GL_DRAW_BUFFER6:

+    case GL_DRAW_BUFFER7:

+    case GL_DRAW_BUFFER8:

+    case GL_DRAW_BUFFER9:

+    case GL_DRAW_BUFFER10:

+    case GL_DRAW_BUFFER11:

+    case GL_DRAW_BUFFER12:

+    case GL_DRAW_BUFFER13:

+    case GL_DRAW_BUFFER14:

+    case GL_DRAW_BUFFER15:

+    case GL_MAJOR_VERSION:

+    case GL_MAX_3D_TEXTURE_SIZE:

+    case GL_MAX_ARRAY_TEXTURE_LAYERS:

+    case GL_MAX_COLOR_ATTACHMENTS:

+    case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:

+    case GL_MAX_COMBINED_UNIFORM_BLOCKS:

+    case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:

+    case GL_MAX_DRAW_BUFFERS:

+    case GL_MAX_ELEMENT_INDEX:

+    case GL_MAX_ELEMENTS_INDICES:

+    case GL_MAX_ELEMENTS_VERTICES:

+    case GL_MAX_FRAGMENT_INPUT_COMPONENTS:

+    case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:

+    case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:

+    case GL_MAX_PROGRAM_TEXEL_OFFSET:

+    case GL_MAX_SERVER_WAIT_TIMEOUT:

+    case GL_MAX_TEXTURE_LOD_BIAS:

+    case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:

+    case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:

+    case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:

+    case GL_MAX_UNIFORM_BLOCK_SIZE:

+    case GL_MAX_UNIFORM_BUFFER_BINDINGS:

+    case GL_MAX_VARYING_COMPONENTS:

+    case GL_MAX_VERTEX_OUTPUT_COMPONENTS:

+    case GL_MAX_VERTEX_UNIFORM_BLOCKS:

+    case GL_MAX_VERTEX_UNIFORM_COMPONENTS:

+    case GL_MIN_PROGRAM_TEXEL_OFFSET:

+    case GL_MINOR_VERSION:

+    case GL_NUM_EXTENSIONS:

+    case GL_NUM_PROGRAM_BINARY_FORMATS:

+    case GL_PACK_ROW_LENGTH:

+    case GL_PACK_SKIP_PIXELS:

+    case GL_PACK_SKIP_ROWS:

+    case GL_PIXEL_PACK_BUFFER_BINDING:

+    case GL_PIXEL_UNPACK_BUFFER_BINDING:

+    case GL_PROGRAM_BINARY_FORMATS:

+    case GL_READ_BUFFER:

+    case GL_SAMPLER_BINDING:

+    case GL_TEXTURE_BINDING_2D_ARRAY:

+    case GL_UNIFORM_BUFFER_BINDING:

+    case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:

+    case GL_UNIFORM_BUFFER_SIZE:

+    case GL_UNIFORM_BUFFER_START:

+    case GL_UNPACK_IMAGE_HEIGHT:

+    case GL_UNPACK_ROW_LENGTH:

+    case GL_UNPACK_SKIP_IMAGES:

+    case GL_UNPACK_SKIP_PIXELS:

+    case GL_UNPACK_SKIP_ROWS:

+    case GL_VERTEX_ARRAY_BINDING:

         {

             *type = GL_INT;

             *numParams = 1;

         }

         break;

-      case GL_MAX_SAMPLES_ANGLE:

+    case GL_MAX_SAMPLES_ANGLE:

         {

             *type = GL_INT;

             *numParams = 1;

         }

         break;

-      case GL_MAX_VIEWPORT_DIMS:

+    case GL_MAX_VIEWPORT_DIMS:

         {

             *type = GL_INT;

             *numParams = 2;

         }

         break;

-      case GL_VIEWPORT:

-      case GL_SCISSOR_BOX:

+    case GL_VIEWPORT:

+    case GL_SCISSOR_BOX:

         {

             *type = GL_INT;

             *numParams = 4;

         }

         break;

-      case GL_SHADER_COMPILER:

-      case GL_SAMPLE_COVERAGE_INVERT:

-      case GL_DEPTH_WRITEMASK:

-      case GL_CULL_FACE:                // CULL_FACE through DITHER are natural to IsEnabled,

-      case GL_POLYGON_OFFSET_FILL:      // but can be retrieved through the Get{Type}v queries.

-      case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural

-      case GL_SAMPLE_COVERAGE:

-      case GL_SCISSOR_TEST:

-      case GL_STENCIL_TEST:

-      case GL_DEPTH_TEST:

-      case GL_BLEND:

-      case GL_DITHER:

-      case GL_PRIMITIVE_RESTART_FIXED_INDEX:

-      case GL_RASTERIZER_DISCARD:

+    case GL_SHADER_COMPILER:

+    case GL_SAMPLE_COVERAGE_INVERT:

+    case GL_DEPTH_WRITEMASK:

+    case GL_CULL_FACE:                // CULL_FACE through DITHER are natural to IsEnabled,

+    case GL_POLYGON_OFFSET_FILL:      // but can be retrieved through the Get{Type}v queries.

+    case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural

+    case GL_SAMPLE_COVERAGE:

+    case GL_SCISSOR_TEST:

+    case GL_STENCIL_TEST:

+    case GL_DEPTH_TEST:

+    case GL_BLEND:

+    case GL_DITHER:

+    case GL_PRIMITIVE_RESTART_FIXED_INDEX:

+    case GL_RASTERIZER_DISCARD:

         {

             *type = GL_BOOL;

             *numParams = 1;

         }

         break;

-      case GL_COLOR_WRITEMASK:

+    case GL_COLOR_WRITEMASK:

         {

             *type = GL_BOOL;

             *numParams = 4;

         }

         break;

-      case GL_POLYGON_OFFSET_FACTOR:

-      case GL_POLYGON_OFFSET_UNITS:

-      case GL_SAMPLE_COVERAGE_VALUE:

-      case GL_DEPTH_CLEAR_VALUE:

-      case GL_LINE_WIDTH:

+    case GL_POLYGON_OFFSET_FACTOR:

+    case GL_POLYGON_OFFSET_UNITS:

+    case GL_SAMPLE_COVERAGE_VALUE:

+    case GL_DEPTH_CLEAR_VALUE:

+    case GL_LINE_WIDTH:

         {

             *type = GL_FLOAT;

             *numParams = 1;

         }

         break;

-      case GL_ALIASED_LINE_WIDTH_RANGE:

-      case GL_ALIASED_POINT_SIZE_RANGE:

-      case GL_DEPTH_RANGE:

+    case GL_ALIASED_LINE_WIDTH_RANGE:

+    case GL_ALIASED_POINT_SIZE_RANGE:

+    case GL_DEPTH_RANGE:

         {

             *type = GL_FLOAT;

             *numParams = 2;

         }

         break;

-      case GL_COLOR_CLEAR_VALUE:

-      case GL_BLEND_COLOR:

+    case GL_COLOR_CLEAR_VALUE:

+    case GL_BLEND_COLOR:

         {

             *type = GL_FLOAT;

             *numParams = 4;

         }

         break;

-	  case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:

+	case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:

         *type = GL_FLOAT;

         *numParams = 1;

         break;

-      default:

+    default:

         return false;

     }

 

@@ -3011,7 +3011,7 @@
 	{

 		textureUsed = program->getVertexShader()->usesSampler(index);

 	}

-	else UNREACHABLE();

+	else UNREACHABLE(type);

 

 	sw::Resource *resource = 0;

 

@@ -3337,7 +3337,7 @@
 					break;

 				default:

 					UNIMPLEMENTED();   // FIXME

-					UNREACHABLE();

+					UNREACHABLE(renderTarget->getInternalFormat());

 				}

 

 				switch(format)

@@ -3351,7 +3351,7 @@
 						dest[4 * i + 2] = (unsigned char)(255 * b + 0.5f);

 						dest[4 * i + 3] = (unsigned char)(255 * a + 0.5f);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type);

 					}

 					break;

 				case GL_BGRA_EXT:

@@ -3391,7 +3391,7 @@
 							((unsigned short)(31 * g + 0.5f) << 5) |

 							((unsigned short)(31 * b + 0.5f) << 0);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type);

 					}

 					break;

 				case GL_RGB:

@@ -3403,10 +3403,10 @@
 							((unsigned short)(63 * g + 0.5f) << 5) |

 							((unsigned short)(31 * r + 0.5f) << 11);

 						break;

-					default: UNREACHABLE();

+					default: UNREACHABLE(type);

 					}

 					break;

-				default: UNREACHABLE();

+				default: UNREACHABLE(format);

 				}

 			}

         }

@@ -3904,7 +3904,7 @@
       case GL_LINE_LOOP:

       case GL_LINE_STRIP:

         return false;

-      default: UNREACHABLE();

+      default: UNREACHABLE(drawMode);

     }

 

     return false;

@@ -4303,7 +4303,7 @@
             return EGL_BAD_ACCESS;

         }

     }

-    else UNREACHABLE();

+    else UNREACHABLE(target);

 

 	return EGL_SUCCESS;

 }

@@ -4335,7 +4335,7 @@
 

         return renderbuffer->createSharedImage();

     }

-    else UNREACHABLE();

+    else UNREACHABLE(target);

 

 	return 0;

 }

diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 6ad4289..7d47574 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -160,7 +160,7 @@
         case GL_UNSIGNED_SHORT: return mSize * sizeof(GLushort);

         case GL_FIXED:          return mSize * sizeof(GLfixed);

         case GL_FLOAT:          return mSize * sizeof(GLfloat);

-        default: UNREACHABLE(); return mSize * sizeof(GLfloat);

+        default: UNREACHABLE(mType); return mSize * sizeof(GLfloat);

         }

     }

 

@@ -176,7 +176,7 @@
 		case ValueUnion::FloatType:	return mCurrentValue[i].f;

 		case ValueUnion::IntType:	return static_cast<float>(mCurrentValue[i].i);

 		case ValueUnion::UIntType:	return static_cast<float>(mCurrentValue[i].ui);

-		default: UNREACHABLE();		return mCurrentValue[i].f;

+		default: UNREACHABLE(mCurrentValueType); return mCurrentValue[i].f;

 		}

 	}

 

@@ -187,7 +187,7 @@
 		case ValueUnion::FloatType:	return static_cast<GLint>(mCurrentValue[i].f);

 		case ValueUnion::IntType:	return mCurrentValue[i].i;

 		case ValueUnion::UIntType:	return static_cast<GLint>(mCurrentValue[i].ui);

-		default: UNREACHABLE();		return mCurrentValue[i].i;

+		default: UNREACHABLE(mCurrentValueType); return mCurrentValue[i].i;

 		}

 	}

 

@@ -198,7 +198,7 @@
 		case ValueUnion::FloatType:	return static_cast<GLuint>(mCurrentValue[i].f);

 		case ValueUnion::IntType:	return static_cast<GLuint>(mCurrentValue[i].i);

 		case ValueUnion::UIntType:	return mCurrentValue[i].ui;

-		default: UNREACHABLE();		return mCurrentValue[i].ui;

+		default: UNREACHABLE(mCurrentValueType); return mCurrentValue[i].ui;

 		}

 	}

 

diff --git a/src/OpenGL/libGLESv2/Device.cpp b/src/OpenGL/libGLESv2/Device.cpp
index 6a41e1e..201bf00 100644
--- a/src/OpenGL/libGLESv2/Device.cpp
+++ b/src/OpenGL/libGLESv2/Device.cpp
@@ -245,7 +245,7 @@
 			lockable = true;

 			break;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(format);

 		}

 

 		egl::Image *surface = new egl::Image(width, height, format, multiSampleDepth, lockable, true);

@@ -298,7 +298,7 @@
 			case DRAW_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST32;  break;

 			case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP32; break;

 			case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN32;	  break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(type);

 			}

 		}

 		else if(indexSize == 2)

@@ -312,7 +312,7 @@
 			case DRAW_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST16;  break;

 			case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP16; break;

 			case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN16;   break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(type);

 			}

 		}

 		else if(indexSize == 1)

@@ -326,10 +326,10 @@
 			case DRAW_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST8;  break;

 			case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP8; break;

 			case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN8;   break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(type);

 			}

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(indexSize);

 

 		draw(drawType, indexOffset, primitiveCount);

 	}

@@ -354,7 +354,7 @@
 		case DRAW_TRIANGLELIST:  drawType = sw::DRAW_TRIANGLELIST;  break;

 		case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_TRIANGLESTRIP; break;

 		case DRAW_TRIANGLEFAN:   drawType = sw::DRAW_TRIANGLEFAN;   break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(primitiveType);

 		}

 

 		draw(drawType, 0, primitiveCount);

diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index 451263d..2fe1320 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -59,10 +59,7 @@
 	{
 		buffer = context->getTexture(handle)->getRenderbuffer(type, level, layer);
 	}
-	else
-	{
-		UNREACHABLE();
-	}
+	else UNREACHABLE(type);
 
 	return buffer;
 }
@@ -295,7 +292,7 @@
 			}
 			else
 			{
-				UNREACHABLE();
+				UNREACHABLE(mColorbufferType[i]);
 				return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 			}
 
@@ -338,7 +335,7 @@
 		}
 		else
 		{
-			UNREACHABLE();
+			UNREACHABLE(mDepthbufferType);
 			return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 		}
 
@@ -390,7 +387,7 @@
 		}
 		else
 		{
-			UNREACHABLE();
+			UNREACHABLE(mStencilbufferType);
 			return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 		}
 
@@ -444,7 +441,7 @@
 		case sw::FORMAT_A1R5G5B5:      return GL_BGRA_EXT;
 		case sw::FORMAT_R5G6B5:        return 0x80E0;   // GL_BGR_EXT
 		default:
-			UNREACHABLE();
+			UNREACHABLE(colorbuffer->getInternalFormat());
 		}
 	}
 
@@ -468,7 +465,7 @@
 		case sw::FORMAT_A1R5G5B5:      return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
 		case sw::FORMAT_R5G6B5:        return GL_UNSIGNED_SHORT_5_6_5;
 		default:
-			UNREACHABLE();
+			UNREACHABLE(colorbuffer->getInternalFormat());
 		}
 	}
 
diff --git a/src/OpenGL/libGLESv2/IndexDataManager.cpp b/src/OpenGL/libGLESv2/IndexDataManager.cpp
index 0bf93f0..f0da7be 100644
--- a/src/OpenGL/libGLESv2/IndexDataManager.cpp
+++ b/src/OpenGL/libGLESv2/IndexDataManager.cpp
@@ -57,7 +57,7 @@
     {

         memcpy(output, input, count * sizeof(GLushort));

     }

-    else UNREACHABLE();

+    else UNREACHABLE(type);

 }

 

 template<class IndexType>

@@ -87,7 +87,7 @@
     {

         computeRange(static_cast<const GLushort*>(indices), count, minIndex, maxIndex);

     }

-    else UNREACHABLE();

+    else UNREACHABLE(type);

 }

 

 GLenum IndexDataManager::prepareIndexData(GLenum type, GLuint start, GLuint end, GLsizei count, Buffer *buffer, const void *indices, TranslatedIndexData *translated)

@@ -107,7 +107,7 @@
           case GL_UNSIGNED_BYTE:  alignedOffset = (offset % sizeof(GLubyte) == 0);  break;

           case GL_UNSIGNED_SHORT: alignedOffset = (offset % sizeof(GLushort) == 0); break;

           case GL_UNSIGNED_INT:   alignedOffset = (offset % sizeof(GLuint) == 0);   break;

-          default: UNREACHABLE(); alignedOffset = false;

+          default: UNREACHABLE(type); alignedOffset = false;

         }

 

         if(typeSize(type) * count + offset > static_cast<std::size_t>(buffer->size()))

@@ -167,7 +167,7 @@
     case GL_UNSIGNED_INT:   return sizeof(GLuint);

     case GL_UNSIGNED_SHORT: return sizeof(GLushort);

     case GL_UNSIGNED_BYTE:  return sizeof(GLubyte);

-    default: UNREACHABLE(); return sizeof(GLushort);

+    default: UNREACHABLE(type); return sizeof(GLushort);

     }

 }

 

diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index 50baf80..4f89f04 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -158,7 +158,7 @@
 			fragmentShader = (FragmentShader*)shader;

 			fragmentShader->addRef();

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(shader->getType());

 

 		return true;

 	}

@@ -185,7 +185,7 @@
 			fragmentShader->release();

 			fragmentShader = 0;

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(shader->getType());

 

 		return true;

 	}

@@ -264,7 +264,7 @@
 				logicalTextureUnit = samplersVS[samplerIndex].logicalTextureUnit;

 			}

 			break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(type);

 		}

 

 		if(logicalTextureUnit >= 0 && logicalTextureUnit < MAX_COMBINED_TEXTURE_IMAGE_UNITS)

@@ -288,7 +288,7 @@
 			ASSERT(samplerIndex < sizeof(samplersVS)/sizeof(samplersVS[0]));

 			ASSERT(samplersVS[samplerIndex].active);

 			return samplersVS[samplerIndex].textureType;

-		default: UNREACHABLE();

+		default: UNREACHABLE(type);

 		}

 

 		return TEXTURE_2D;

@@ -373,7 +373,7 @@
 		case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:

 			*params = static_cast<GLint>(uniformBlock.isReferencedByFragmentShader());

 			break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(pname);

 		}

 	}

 

@@ -873,7 +873,7 @@
 

 		switch (UniformComponentType(targetUniform->type))

 		{

-		  case GL_BOOL:

+		case GL_BOOL:

 			{

 				GLboolean *boolParams = (GLboolean*)targetUniform->data + uniformIndex[location].element * count;

 

@@ -883,11 +883,11 @@
 				}

 			}

 			break;

-		  case GL_FLOAT:

+		case GL_FLOAT:

 			memcpy(params, targetUniform->data + uniformIndex[location].element * count * sizeof(GLfloat),

 				   count * sizeof(GLfloat));

 			break;

-		  case GL_INT:

+		case GL_INT:

 			{

 				GLint *intParams = (GLint*)targetUniform->data + uniformIndex[location].element * count;

 

@@ -897,7 +897,7 @@
 				}

 			}

 			break;

-			case GL_UNSIGNED_INT:

+		case GL_UNSIGNED_INT:

 			{

 				GLuint *uintParams = (GLuint*)targetUniform->data + uniformIndex[location].element * count;

 

@@ -907,8 +907,7 @@
 				}

 			}

 			break;

-

-		  default: UNREACHABLE();

+		default: UNREACHABLE(targetUniform->type);

 		}

 

 		return true;

@@ -932,7 +931,7 @@
 

 		switch (UniformComponentType(targetUniform->type))

 		{

-		  case GL_BOOL:

+		case GL_BOOL:

 			{

 				GLboolean *boolParams = targetUniform->data + uniformIndex[location].element * count;

 

@@ -942,7 +941,7 @@
 				}

 			}

 			break;

-		  case GL_FLOAT:

+		case GL_FLOAT:

 			{

 				GLfloat *floatParams = (GLfloat*)targetUniform->data + uniformIndex[location].element * count;

 

@@ -952,12 +951,12 @@
 				}

 			}

 			break;

-		  case GL_INT:

-		  case GL_UNSIGNED_INT:

+		case GL_INT:

+		case GL_UNSIGNED_INT:

 			memcpy(params, targetUniform->data + uniformIndex[location].element * count * sizeof(GLint),

 				   count * sizeof(GLint));

 			break;

-		  default: UNREACHABLE();

+		default: UNREACHABLE(targetUniform->type);

 		}

 

 		return true;

@@ -1006,7 +1005,7 @@
 			memcpy(params, targetUniform->data + uniformIndex[location].element * count * sizeof(GLuint),

 				   count * sizeof(GLuint));

 			break;

-		default: UNREACHABLE();

+		default: UNREACHABLE(targetUniform->type);

 		}

 

 		return true;

@@ -1044,37 +1043,37 @@
 

 				switch(targetUniform->type)

 				{

-				  case GL_BOOL:       applyUniform1bv(location, size, b);       break;

-				  case GL_BOOL_VEC2:  applyUniform2bv(location, size, b);       break;

-				  case GL_BOOL_VEC3:  applyUniform3bv(location, size, b);       break;

-				  case GL_BOOL_VEC4:  applyUniform4bv(location, size, b);       break;

-				  case GL_FLOAT:      applyUniform1fv(location, size, f);       break;

-				  case GL_FLOAT_VEC2: applyUniform2fv(location, size, f);       break;

-				  case GL_FLOAT_VEC3: applyUniform3fv(location, size, f);       break;

-				  case GL_FLOAT_VEC4: applyUniform4fv(location, size, f);       break;

-				  case GL_FLOAT_MAT2:   applyUniformMatrix2fv(location, size, f);   break;

-				  case GL_FLOAT_MAT2x3: applyUniformMatrix2x3fv(location, size, f); break;

-				  case GL_FLOAT_MAT2x4: applyUniformMatrix2x4fv(location, size, f); break;

-				  case GL_FLOAT_MAT3x2: applyUniformMatrix3x2fv(location, size, f); break;

-				  case GL_FLOAT_MAT3:   applyUniformMatrix3fv(location, size, f);   break;

-				  case GL_FLOAT_MAT3x4: applyUniformMatrix3x4fv(location, size, f); break;

-				  case GL_FLOAT_MAT4x2: applyUniformMatrix4x2fv(location, size, f); break;

-				  case GL_FLOAT_MAT4x3: applyUniformMatrix4x3fv(location, size, f); break;

-				  case GL_FLOAT_MAT4:   applyUniformMatrix4fv(location, size, f);   break;

-				  case GL_SAMPLER_2D:

-				  case GL_SAMPLER_CUBE:

-				  case GL_SAMPLER_EXTERNAL_OES:

-				  case GL_SAMPLER_3D_OES:

-				  case GL_INT:        applyUniform1iv(location, size, i);       break;

-				  case GL_INT_VEC2:   applyUniform2iv(location, size, i);       break;

-				  case GL_INT_VEC3:   applyUniform3iv(location, size, i);       break;

-				  case GL_INT_VEC4:   applyUniform4iv(location, size, i);       break;

-				  case GL_UNSIGNED_INT:      applyUniform1uiv(location, size, ui); break;

-				  case GL_UNSIGNED_INT_VEC2: applyUniform2uiv(location, size, ui); break;

-				  case GL_UNSIGNED_INT_VEC3: applyUniform3uiv(location, size, ui); break;

-				  case GL_UNSIGNED_INT_VEC4: applyUniform4uiv(location, size, ui); break;

-				  default:

-					UNREACHABLE();

+				case GL_BOOL:       applyUniform1bv(location, size, b);       break;

+				case GL_BOOL_VEC2:  applyUniform2bv(location, size, b);       break;

+				case GL_BOOL_VEC3:  applyUniform3bv(location, size, b);       break;

+				case GL_BOOL_VEC4:  applyUniform4bv(location, size, b);       break;

+				case GL_FLOAT:      applyUniform1fv(location, size, f);       break;

+				case GL_FLOAT_VEC2: applyUniform2fv(location, size, f);       break;

+				case GL_FLOAT_VEC3: applyUniform3fv(location, size, f);       break;

+				case GL_FLOAT_VEC4: applyUniform4fv(location, size, f);       break;

+				case GL_FLOAT_MAT2:   applyUniformMatrix2fv(location, size, f);   break;

+				case GL_FLOAT_MAT2x3: applyUniformMatrix2x3fv(location, size, f); break;

+				case GL_FLOAT_MAT2x4: applyUniformMatrix2x4fv(location, size, f); break;

+				case GL_FLOAT_MAT3x2: applyUniformMatrix3x2fv(location, size, f); break;

+				case GL_FLOAT_MAT3:   applyUniformMatrix3fv(location, size, f);   break;

+				case GL_FLOAT_MAT3x4: applyUniformMatrix3x4fv(location, size, f); break;

+				case GL_FLOAT_MAT4x2: applyUniformMatrix4x2fv(location, size, f); break;

+				case GL_FLOAT_MAT4x3: applyUniformMatrix4x3fv(location, size, f); break;

+				case GL_FLOAT_MAT4:   applyUniformMatrix4fv(location, size, f);   break;

+				case GL_SAMPLER_2D:

+				case GL_SAMPLER_CUBE:

+				case GL_SAMPLER_EXTERNAL_OES:

+				case GL_SAMPLER_3D_OES:

+				case GL_INT:        applyUniform1iv(location, size, i);       break;

+				case GL_INT_VEC2:   applyUniform2iv(location, size, i);       break;

+				case GL_INT_VEC3:   applyUniform3iv(location, size, i);       break;

+				case GL_INT_VEC4:   applyUniform4iv(location, size, i);       break;

+				case GL_UNSIGNED_INT:      applyUniform1uiv(location, size, ui); break;

+				case GL_UNSIGNED_INT_VEC2: applyUniform2uiv(location, size, ui); break;

+				case GL_UNSIGNED_INT_VEC3: applyUniform3uiv(location, size, ui); break;

+				case GL_UNSIGNED_INT_VEC4: applyUniform4uiv(location, size, ui); break;

+				default:

+					UNREACHABLE(targetUniform->type);

 				}

 

 				targetUniform->dirty = false;

@@ -1328,7 +1327,7 @@
 

 						switch(type)

 						{

-						default:                      UNREACHABLE();

+						default:                      UNREACHABLE(type);

 						case GL_SAMPLER_2D:           samplersVS[index].textureType = TEXTURE_2D;       break;

 						case GL_SAMPLER_CUBE:         samplersVS[index].textureType = TEXTURE_CUBE;     break;

 						case GL_SAMPLER_3D_OES:       samplersVS[index].textureType = TEXTURE_3D;       break;

@@ -1351,7 +1350,7 @@
 						

 						switch(type)

 						{

-						default:                      UNREACHABLE();

+						default:                      UNREACHABLE(type);

 						case GL_SAMPLER_2D:           samplersPS[index].textureType = TEXTURE_2D;       break;

 						case GL_SAMPLER_CUBE:         samplersPS[index].textureType = TEXTURE_CUBE;     break;

 						case GL_SAMPLER_3D_OES:       samplersPS[index].textureType = TEXTURE_3D;       break;

@@ -1366,7 +1365,7 @@
 						return false;

 					}

 				}

-				else UNREACHABLE();

+				else UNREACHABLE(shader);

 

 				index++;

 			}

@@ -1410,7 +1409,7 @@
 		{

 			uniform->psRegisterIndex = registerIndex;

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(shader);

 

 		if(location == -1)   // Not previously defined

 		{

@@ -1439,7 +1438,7 @@
 				return false;

 			}

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(shader);

 

 		return true;

 	}

@@ -2526,7 +2525,7 @@
 		case GL_UNIFORM_MATRIX_STRIDE: return uniform.blockInfo.matrixStride;

 		case GL_UNIFORM_IS_ROW_MAJOR: return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);

 		default:

-			UNREACHABLE();

+			UNREACHABLE(pname);

 			break;

 		}

 		return 0;

diff --git a/src/OpenGL/libGLESv2/ResourceManager.cpp b/src/OpenGL/libGLESv2/ResourceManager.cpp
index e1b1af3..0964446 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.cpp
+++ b/src/OpenGL/libGLESv2/ResourceManager.cpp
@@ -56,14 +56,14 @@
         deleteTexture(mTextureMap.begin()->first);
     }
 
-	while(!mSamplerMap.empty())

-	{

-		deleteSampler(mSamplerMap.begin()->first);

-	}

-

-	while(!mFenceSyncMap.empty())

-	{

-		deleteFenceSync(mFenceSyncMap.begin()->first);

+	while(!mSamplerMap.empty())
+	{
+		deleteSampler(mSamplerMap.begin()->first);
+	}
+
+	while(!mFenceSyncMap.empty())
+	{
+		deleteFenceSync(mFenceSyncMap.begin()->first);
 	}
 }
 
@@ -103,7 +103,7 @@
     {
         mShaderMap[handle] = new FragmentShader(this, handle);
     }
-    else UNREACHABLE();
+    else UNREACHABLE(type);
 
     return handle;
 }
@@ -138,24 +138,24 @@
     return handle;
 }
 
-// Returns an unused sampler name

-GLuint ResourceManager::createSampler()

-{

-	GLuint handle = mSamplerHandleAllocator.allocate();

-

-	mSamplerMap[handle] = NULL;

-

-	return handle;

-}

-

-// Returns the next unused fence name, and allocates the fence

-GLuint ResourceManager::createFenceSync(GLenum condition, GLbitfield flags)

-{

-	GLuint handle = mFenceSyncHandleAllocator.allocate();

-

-	mFenceSyncMap[handle] = new FenceSync(handle, condition, flags);

-

-	return handle;

+// Returns an unused sampler name
+GLuint ResourceManager::createSampler()
+{
+	GLuint handle = mSamplerHandleAllocator.allocate();
+
+	mSamplerMap[handle] = NULL;
+
+	return handle;
+}
+
+// Returns the next unused fence name, and allocates the fence
+GLuint ResourceManager::createFenceSync(GLenum condition, GLbitfield flags)
+{
+	GLuint handle = mFenceSyncHandleAllocator.allocate();
+
+	mFenceSyncMap[handle] = new FenceSync(handle, condition, flags);
+
+	return handle;
 }
 
 void ResourceManager::deleteBuffer(GLuint buffer)
@@ -232,28 +232,28 @@
     }
 }
 
-void ResourceManager::deleteSampler(GLuint sampler)

-{

-	auto samplerObject = mSamplerMap.find(sampler);

-

-	if(samplerObject != mSamplerMap.end())

-	{

-		mSamplerHandleAllocator.release(samplerObject->first);

-		if(samplerObject->second) samplerObject->second->release();

-		mSamplerMap.erase(samplerObject);

-	}

-}

-

-void ResourceManager::deleteFenceSync(GLuint fenceSync)

-{

-	auto fenceObjectIt = mFenceSyncMap.find(fenceSync);

-

-	if(fenceObjectIt != mFenceSyncMap.end())

-	{

-		mFenceSyncHandleAllocator.release(fenceObjectIt->first);

-		if(fenceObjectIt->second) fenceObjectIt->second->release();

-		mFenceSyncMap.erase(fenceObjectIt);

-	}

+void ResourceManager::deleteSampler(GLuint sampler)
+{
+	auto samplerObject = mSamplerMap.find(sampler);
+
+	if(samplerObject != mSamplerMap.end())
+	{
+		mSamplerHandleAllocator.release(samplerObject->first);
+		if(samplerObject->second) samplerObject->second->release();
+		mSamplerMap.erase(samplerObject);
+	}
+}
+
+void ResourceManager::deleteFenceSync(GLuint fenceSync)
+{
+	auto fenceObjectIt = mFenceSyncMap.find(fenceSync);
+
+	if(fenceObjectIt != mFenceSyncMap.end())
+	{
+		mFenceSyncHandleAllocator.release(fenceObjectIt->first);
+		if(fenceObjectIt->second) fenceObjectIt->second->release();
+		mFenceSyncMap.erase(fenceObjectIt);
+	}
 }
 
 Buffer *ResourceManager::getBuffer(unsigned int handle)
@@ -334,33 +334,33 @@
     }
 }
 
-Sampler *ResourceManager::getSampler(unsigned int handle)

-{

-	auto sampler = mSamplerMap.find(handle);

-

-	if(sampler == mSamplerMap.end())

-	{

-		return NULL;

-	}

-	else

-	{

-		return sampler->second;

-	}

-}

-

-FenceSync *ResourceManager::getFenceSync(unsigned int handle)

-{

-	auto fenceObjectIt = mFenceSyncMap.find(handle);

-

-	if(fenceObjectIt == mFenceSyncMap.end())

-	{

-		return NULL;

-	}

-	else

-	{

-		return fenceObjectIt->second;

-	}

-}

+Sampler *ResourceManager::getSampler(unsigned int handle)
+{
+	auto sampler = mSamplerMap.find(handle);
+
+	if(sampler == mSamplerMap.end())
+	{
+		return NULL;
+	}
+	else
+	{
+		return sampler->second;
+	}
+}
+
+FenceSync *ResourceManager::getFenceSync(unsigned int handle)
+{
+	auto fenceObjectIt = mFenceSyncMap.find(handle);
+
+	if(fenceObjectIt == mFenceSyncMap.end())
+	{
+		return NULL;
+	}
+	else
+	{
+		return fenceObjectIt->second;
+	}
+}
 
 void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
 {
@@ -405,7 +405,7 @@
 		}
 		else
         {
-            UNREACHABLE();
+            UNREACHABLE(type);
             return;
         }
 
@@ -414,20 +414,20 @@
     }
 }
 
-void ResourceManager::checkSamplerAllocation(GLuint sampler)

-{

-	if(sampler != 0 && !getSampler(sampler))

-	{

-		Sampler *samplerObject = new Sampler(sampler);

-		mSamplerMap[sampler] = samplerObject;

-		samplerObject->addRef();

-		// Samplers cannot be created via Bind

-	}

-}

-

-bool ResourceManager::isSampler(GLuint sampler)

-{

-	return mSamplerMap.find(sampler) != mSamplerMap.end();

+void ResourceManager::checkSamplerAllocation(GLuint sampler)
+{
+	if(sampler != 0 && !getSampler(sampler))
+	{
+		Sampler *samplerObject = new Sampler(sampler);
+		mSamplerMap[sampler] = samplerObject;
+		samplerObject->addRef();
+		// Samplers cannot be created via Bind
+	}
+}
+
+bool ResourceManager::isSampler(GLuint sampler)
+{
+	return mSamplerMap.find(sampler) != mSamplerMap.end();
 }
 
 }
diff --git a/src/OpenGL/libGLESv2/Shader.cpp b/src/OpenGL/libGLESv2/Shader.cpp
index 2e52e16..e8f6f1b 100644
--- a/src/OpenGL/libGLESv2/Shader.cpp
+++ b/src/OpenGL/libGLESv2/Shader.cpp
@@ -169,9 +169,9 @@
 	resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
 	resources.MaxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS;
 	resources.MaxDrawBuffers = MAX_DRAW_BUFFERS;
-	resources.MaxVertexOutputVectors = MAX_VERTEX_OUTPUT_VECTORS;

-	resources.MaxFragmentInputVectors = MAX_FRAGMENT_INPUT_VECTORS;

-	resources.MinProgramTexelOffset = MIN_PROGRAM_TEXEL_OFFSET;

+	resources.MaxVertexOutputVectors = MAX_VERTEX_OUTPUT_VECTORS;
+	resources.MaxFragmentInputVectors = MAX_FRAGMENT_INPUT_VECTORS;
+	resources.MinProgramTexelOffset = MIN_PROGRAM_TEXEL_OFFSET;
 	resources.MaxProgramTexelOffset = MAX_PROGRAM_TEXEL_OFFSET;
 	resources.OES_standard_derivatives = 1;
 	resources.OES_fragment_precision_high = 1;
@@ -310,7 +310,7 @@
     {
         return GL_FLOAT_MAT4;
     }
-    else UNREACHABLE();
+    else UNREACHABLE(type);
 
     return GL_NONE;
 }
@@ -325,74 +325,74 @@
 
     switch (x.type)
     {
-      case GL_FLOAT_MAT4: return true;
-      case GL_FLOAT_MAT2:
+    case GL_FLOAT_MAT4: return true;
+    case GL_FLOAT_MAT2:
         switch(y.type)
         {
-          case GL_FLOAT_MAT4: return false;
-          case GL_FLOAT_MAT2: return true;
-          case GL_FLOAT_VEC4: return true;
-          case GL_FLOAT_MAT3: return true;
-          case GL_FLOAT_VEC3: return true;
-          case GL_FLOAT_VEC2: return true;
-          case GL_FLOAT:      return true;
-          default: UNREACHABLE();
+        case GL_FLOAT_MAT4: return false;
+        case GL_FLOAT_MAT2: return true;
+        case GL_FLOAT_VEC4: return true;
+        case GL_FLOAT_MAT3: return true;
+        case GL_FLOAT_VEC3: return true;
+        case GL_FLOAT_VEC2: return true;
+        case GL_FLOAT:      return true;
+        default: UNREACHABLE(y.type);
         }
         break;
-      case GL_FLOAT_VEC4:
+    case GL_FLOAT_VEC4:
         switch(y.type)
         {
-          case GL_FLOAT_MAT4: return false;
-          case GL_FLOAT_MAT2: return false;
-          case GL_FLOAT_VEC4: return true;
-          case GL_FLOAT_MAT3: return true;
-          case GL_FLOAT_VEC3: return true;
-          case GL_FLOAT_VEC2: return true;
-          case GL_FLOAT:      return true;
-          default: UNREACHABLE();
+        case GL_FLOAT_MAT4: return false;
+        case GL_FLOAT_MAT2: return false;
+        case GL_FLOAT_VEC4: return true;
+        case GL_FLOAT_MAT3: return true;
+        case GL_FLOAT_VEC3: return true;
+        case GL_FLOAT_VEC2: return true;
+        case GL_FLOAT:      return true;
+        default: UNREACHABLE(y.type);
         }
         break;
-      case GL_FLOAT_MAT3:
+    case GL_FLOAT_MAT3:
         switch(y.type)
         {
-          case GL_FLOAT_MAT4: return false;
-          case GL_FLOAT_MAT2: return false;
-          case GL_FLOAT_VEC4: return false;
-          case GL_FLOAT_MAT3: return true;
-          case GL_FLOAT_VEC3: return true;
-          case GL_FLOAT_VEC2: return true;
-          case GL_FLOAT:      return true;
-          default: UNREACHABLE();
+        case GL_FLOAT_MAT4: return false;
+        case GL_FLOAT_MAT2: return false;
+        case GL_FLOAT_VEC4: return false;
+        case GL_FLOAT_MAT3: return true;
+        case GL_FLOAT_VEC3: return true;
+        case GL_FLOAT_VEC2: return true;
+        case GL_FLOAT:      return true;
+        default: UNREACHABLE(y.type);
         }
         break;
-      case GL_FLOAT_VEC3:
+    case GL_FLOAT_VEC3:
         switch(y.type)
         {
-          case GL_FLOAT_MAT4: return false;
-          case GL_FLOAT_MAT2: return false;
-          case GL_FLOAT_VEC4: return false;
-          case GL_FLOAT_MAT3: return false;
-          case GL_FLOAT_VEC3: return true;
-          case GL_FLOAT_VEC2: return true;
-          case GL_FLOAT:      return true;
-          default: UNREACHABLE();
+        case GL_FLOAT_MAT4: return false;
+        case GL_FLOAT_MAT2: return false;
+        case GL_FLOAT_VEC4: return false;
+        case GL_FLOAT_MAT3: return false;
+        case GL_FLOAT_VEC3: return true;
+        case GL_FLOAT_VEC2: return true;
+        case GL_FLOAT:      return true;
+        default: UNREACHABLE(y.type);
         }
         break;
-      case GL_FLOAT_VEC2:
+    case GL_FLOAT_VEC2:
         switch(y.type)
         {
-          case GL_FLOAT_MAT4: return false;
-          case GL_FLOAT_MAT2: return false;
-          case GL_FLOAT_VEC4: return false;
-          case GL_FLOAT_MAT3: return false;
-          case GL_FLOAT_VEC3: return false;
-          case GL_FLOAT_VEC2: return true;
-          case GL_FLOAT:      return true;
-          default: UNREACHABLE();
+        case GL_FLOAT_MAT4: return false;
+        case GL_FLOAT_MAT2: return false;
+        case GL_FLOAT_VEC4: return false;
+        case GL_FLOAT_MAT3: return false;
+        case GL_FLOAT_VEC3: return false;
+        case GL_FLOAT_VEC2: return true;
+        case GL_FLOAT:      return true;
+        default: UNREACHABLE(y.type);
         }
         break;
-      case GL_FLOAT: return false;
-      default: UNREACHABLE();
+    case GL_FLOAT: return false;
+    default: UNREACHABLE(x.type);
     }
 
     return false;
diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index 8705ff5..6c218fc 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -494,7 +494,7 @@
     case GL_NEAREST_MIPMAP_LINEAR:

     case GL_LINEAR_MIPMAP_LINEAR:

         return true;

-    default: UNREACHABLE();

+    default: UNREACHABLE(mMinFilter);

     }

 

 	return false;

@@ -1203,7 +1203,7 @@
 

 void TextureCubeMap::releaseTexImage()

 {

-    UNREACHABLE();   // Cube maps cannot have an EGL surface bound as an image

+    UNREACHABLE(0);   // Cube maps cannot have an EGL surface bound as an image

 }

 

 void TextureCubeMap::setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels)

@@ -1925,7 +1925,7 @@
 		lockable = true;

 		break;

 	default:

-		UNREACHABLE();

+		UNREACHABLE(format);

 	}

 

 	egl::Image *surface = new egl::Image(width, height, format, multiSampleDepth, lockable, true);

diff --git a/src/OpenGL/libGLESv2/VertexDataManager.cpp b/src/OpenGL/libGLESv2/VertexDataManager.cpp
index 6729c20..7bda77f 100644
--- a/src/OpenGL/libGLESv2/VertexDataManager.cpp
+++ b/src/OpenGL/libGLESv2/VertexDataManager.cpp
@@ -189,7 +189,7 @@
 				case GL_UNSIGNED_SHORT: translated[i].type = sw::STREAMTYPE_USHORT; break;

 				case GL_FIXED:          translated[i].type = sw::STREAMTYPE_FIXED;  break;

 				case GL_FLOAT:          translated[i].type = sw::STREAMTYPE_FLOAT;  break;

-				default: UNREACHABLE(); translated[i].type = sw::STREAMTYPE_FLOAT;  break;

+				default: UNREACHABLE(attrib.mType); translated[i].type = sw::STREAMTYPE_FLOAT;  break;

 				}

 

 				translated[i].count = attrib.mSize;

diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index e7b1156..9ffd42a 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -1097,7 +1097,7 @@
 			case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:

 				texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);

 				break;

-			default: UNREACHABLE();

+			default: UNREACHABLE(target);

 			}

 		}

 	}

@@ -1198,10 +1198,7 @@
 				texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);

 			}

 		}

-		else

-		{

-			UNREACHABLE();

-		}

+		else UNREACHABLE(target);

 	}

 }

 

@@ -1298,7 +1295,7 @@
 

 			texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(target);

 	}

 }

 

@@ -1361,7 +1358,7 @@
 		{

 			texture = context->getTextureCubeMap();

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(target);

 

 		if(!validateSubImageParams(false, width, height, xoffset, yoffset, target, level, GL_NONE, texture))

 		{

@@ -2997,7 +2994,7 @@
 		{

 			attachmentObjectType = GL_TEXTURE;

 		}

-		else UNREACHABLE();

+		else UNREACHABLE(attachmentType);

 

 		switch(pname)

 		{

@@ -6105,10 +6102,7 @@
 				texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackInfo(), pixels);

 			}

 		}

-		else

-		{

-			UNREACHABLE();

-		}

+		else UNREACHABLE(target);

 	}

 }

 

@@ -7289,7 +7283,7 @@
 		{

 		case GL_TEXTURE_2D:           texture = context->getTexture2D();       break;

 		case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break;

-		default:                      UNREACHABLE();

+		default:                      UNREACHABLE(target);

 		}

 

 		if(!texture)

diff --git a/src/OpenGL/libGLESv2/main.cpp b/src/OpenGL/libGLESv2/main.cpp
index 0b2f4cf..3936852 100644
--- a/src/OpenGL/libGLESv2/main.cpp
+++ b/src/OpenGL/libGLESv2/main.cpp
@@ -135,7 +135,7 @@
             context->recordInvalidFramebufferOperation();

             TRACE("\t! Error generated: invalid framebuffer operation\n");

             break;

-        default: UNREACHABLE();

+        default: UNREACHABLE(errorCode);

         }

     }

 }

diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index 71565b1..a60efea 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -65,7 +65,7 @@
 		case GL_FLOAT_MAT4:

 			return 16;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(type);

 		}

 

 		return 0;

@@ -109,7 +109,7 @@
 		case GL_UNSIGNED_INT_VEC4:

 			return GL_UNSIGNED_INT;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(type);

 		}

 

 		return GL_NONE;

@@ -168,7 +168,7 @@
 		case GL_FLOAT_MAT3x4:

 			return 4;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(type);

 		}

 

 		return 0;

@@ -210,7 +210,7 @@
 		case GL_FLOAT_MAT4x3:

 			return 4;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(type);

 		}

 

 		return 0;

@@ -288,7 +288,7 @@
 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: return 3;

 		case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: return 4;

 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: return 5;

-		default: UNREACHABLE(); return 0;

+		default: UNREACHABLE(cubeFace); return 0;

 		}

 	}

 

@@ -534,7 +534,7 @@
 		case GL_GREATER:  return sw::DEPTH_GREATER;

 		case GL_GEQUAL:   return sw::DEPTH_GREATEREQUAL;

 		case GL_NOTEQUAL: return sw::DEPTH_NOTEQUAL;

-		default: UNREACHABLE();

+		default: UNREACHABLE(comparison);

 		}

 

 		return sw::DEPTH_ALWAYS;

@@ -552,7 +552,7 @@
 		case GL_GREATER:  return sw::STENCIL_GREATER;

 		case GL_GEQUAL:   return sw::STENCIL_GREATEREQUAL;

 		case GL_NOTEQUAL: return sw::STENCIL_NOTEQUAL;

-		default: UNREACHABLE();

+		default: UNREACHABLE(comparison);

 		}

 

 		return sw::STENCIL_ALWAYS;

@@ -582,7 +582,7 @@
 		case GL_CONSTANT_ALPHA:           return sw::BLEND_CONSTANTALPHA;

 		case GL_ONE_MINUS_CONSTANT_ALPHA: return sw::BLEND_INVCONSTANTALPHA;

 		case GL_SRC_ALPHA_SATURATE:       return sw::BLEND_SRCALPHASAT;

-		default: UNREACHABLE();

+		default: UNREACHABLE(blend);

 		}

 

 		return sw::BLEND_ZERO;

@@ -597,7 +597,7 @@
 		case GL_FUNC_REVERSE_SUBTRACT: return sw::BLENDOP_INVSUB;

 		case GL_MIN_EXT:               return sw::BLENDOP_MIN;

 		case GL_MAX_EXT:               return sw::BLENDOP_MAX;

-		default: UNREACHABLE();

+		default: UNREACHABLE(blendOp);

 		}

 

 		return sw::BLENDOP_ADD;

@@ -615,7 +615,7 @@
 		case GL_INVERT:    return sw::OPERATION_INVERT;

 		case GL_INCR_WRAP: return sw::OPERATION_INCR;

 		case GL_DECR_WRAP: return sw::OPERATION_DECR;

-		default: UNREACHABLE();

+		default: UNREACHABLE(stencilOp);

 		}

 

 		return sw::OPERATION_KEEP;

@@ -628,7 +628,7 @@
 		case GL_REPEAT:            return sw::ADDRESSING_WRAP;

 		case GL_CLAMP_TO_EDGE:     return sw::ADDRESSING_CLAMP;

 		case GL_MIRRORED_REPEAT:   return sw::ADDRESSING_MIRROR;

-		default: UNREACHABLE();

+		default: UNREACHABLE(wrap);

 		}

 

 		return sw::ADDRESSING_WRAP;

@@ -644,7 +644,7 @@
 			return (frontFace == GL_CCW ? sw::CULL_COUNTERCLOCKWISE : sw::CULL_CLOCKWISE);

 		case GL_FRONT_AND_BACK:

 			return sw::CULL_NONE;   // culling will be handled during draw

-		default: UNREACHABLE();

+		default: UNREACHABLE(cullFace);

 		}

 

 		return sw::CULL_COUNTERCLOCKWISE;

@@ -664,7 +664,7 @@
 		{

 		case GL_NEAREST: return sw::FILTER_POINT;

 		case GL_LINEAR:  return sw::FILTER_LINEAR;

-		default: UNREACHABLE();

+		default: UNREACHABLE(magFilter);

 		}

 

 		return sw::FILTER_POINT;

@@ -701,7 +701,7 @@
 		default:

 			*minFilter = sw::FILTER_POINT;

 			*mipFilter = sw::MIPMAP_NONE;

-			UNREACHABLE();

+			UNREACHABLE(texFilter);

 		}

 

 		if(maxAnisotropy > 1.0f)

@@ -761,7 +761,7 @@
 		case GL_DEPTH_COMPONENT16:

 		case GL_STENCIL_INDEX8:       

 		case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8;

-		default: UNREACHABLE();       return sw::FORMAT_A8B8G8R8;

+		default: UNREACHABLE(format); return sw::FORMAT_A8B8G8R8;

 		}

 	}

 }

@@ -919,7 +919,7 @@
 		case sw::FORMAT_X8R8G8B8: return GL_RGB8_OES;

 		case sw::FORMAT_X8B8G8R8: return GL_RGB8_OES;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(format);

 		}

 

 		return GL_RGBA4;

@@ -936,7 +936,7 @@
 		case sw::FORMAT_D24S8:

 			return GL_DEPTH24_STENCIL8_OES;

 		default:

-			UNREACHABLE();

+			UNREACHABLE(format);

 		}

 

 		return GL_DEPTH24_STENCIL8_OES;